Вправа (Платина)#10314

Вправа (Платина)

1 секунда
512 мегабайтів
Дуже складна

Фермер Джон знову придумав новий режим ранкової зарядки для своїх корів!

Як і раніше, корів фермера Джона вишикувались в лінію. -та корова зліва має мітку для кожного (1 \leq i \leq n). Він каже їм повторювати наступний крок доти, поки корови не повернуться в початковий порядок.

Дано перестановку довжини , корови змінюють свій порядок так, що -та корова зліва до зміни стає A_i-ою зліва після зміни.

Наприклад, якщо A = (1, 2, 3, 4, 5), то корови здійснюють один крок. Якщо A = (2, 3, 1, 5, 4), то корови здійснять шість кроків. Порядок корів зліва направо після кожного кроку буде наступним:

крок: (1, 2, 3, 4, 5)

крок: (3, 1, 2, 5, 4)

крок: (2, 3, 1, 4, 5)

крок: (1, 2, 3, 5, 4)

крок: (3, 1, 2, 4, 5)

крок: (2, 3, 1, 5, 4)

крок: (1, 2, 3, 4, 5)

Обчисліть добуток кількості кроків, необхідних для всіх можливих перестановок довжини .

Оскільки це число може бути дуже великим, виведіть відповідь за модулем .

Учасники, які використовують C++, можуть знайти наступний код з KACTL корисним. Відомий як редукція Барретта, він дозволяє обчислювати % в кілька разів швидше звичайного, де b > 1 константа, невідома під час компіляції (на жаль, нам не відомо про таку оптимізацію для Java).

#include <bits/stdc++.h>
using namespace std;

typedef unsigned long long ull;
typedef __uint128_t L;
struct FastMod {
	ull b, m;
	FastMod(ull b) : b(b), m(ull((L(1) << 64) / b)) {}
	ull reduce(ull a) {
		ull q = (ull)((L(m) * a) >> 64);
		ull r = a - q * b; // can be proven that 0 <= r < 2*b
		return r >= b ? r - b : r;
	}
};
FastMod F(2);

int main() {
	int M = 1000000007; F = FastMod(M);
	ull x = 10ULL*M+3; 
	cout << x << " " << F.reduce(x) << "\n"; // 10000000073 3
}

Вхідні дані

В одному рядку задані числа (1 \leq n \leq 7500) і (10^8 \leq m \leq 10^9 + 7, просте).

Вихідні дані

Виведіть одне число.

Приклади

Приклад 1

Loading
Loading

Примітка

Для кожного (1 \leq i \leq n), -ий елемент наступного масиву - це кількість перестановок, які змушують корів робити кроків: [1, 25, 20, 30, 24, 20]. Відповідь дорівнює 1^1 \cdot 2^{25} \cdot 3^{20} \cdot 4^{30} \cdot 5^{24} \cdot 6^{20} = 369329541 (mod 10^9 + 7).