P5221 Product(欧拉函数)
P5221 Product(欧拉函数)
题目描述
\({\rm CYJian}\)最近闲的玩起了\(gcd\)。。他想到了一个非常简单而有意思的式子:
\[\large\prod_{i=1}^N\prod_{j=1}^N\frac{lcm(i,j)}{gcd(i,j)}\ (\bmod\ 104857601)
\]
\({\rm CYJian}\)已经算出来这个式子的值了。现在请你帮他验算一下吧。\({\rm CYJian}\)只给你\(0.2s\)的时间哦。
数据范围
\(1 \leq N \leq 1000000\)
解题思路
\[\large \prod_{i=1}^N\prod_{j=1}^N\frac{lcm(i,j)}{\gcd(i,j)}\\
\large =\prod_{i=1}^N\prod_{j=1}^N\frac{ij}{\gcd(i,j)^2}\\
\large =\prod_{i=1}^N\prod_{j=1}^Nij *(\prod_{i=1}^N\prod_{j=1}^N\gcd(i,j)^2)^{-1}\\
\large\prod_{i=1}^N\prod_{j=1}^N\gcd(i,j)^2\\
\large =\prod_{d=1}^Nd^{ 2*\sum_{i=1}^{\frac Nd}\sum_{j=1}^{\frac Nd}[\gcd(i,j)=1]}\\
\large =\prod_{d=1}^Nd^{ 2*(2*\varphi(\frac Nd) - 1)}\\
\]
const int N = 1005000;
const int P = 104857601;
bool e[N];
int prime[80000];
int phi[N], tot, n;
ll fpw(ll x, ll mi) {
ll res = 1;
while (mi) {
if (mi & 1) res = res * x % P;
x = x * x % P, mi >>= 1;
}
return res;
}
void prework(int N) {
for (int i = 2;i <= N; i++) {
if (!e[i]) prime[++tot] = i, phi[i] = i - 1;
for (int j = 1;j <= tot && prime[j] * i <= N; j++) {
int t = prime[j] * i; e[t] = 1;
if (i % prime[j] == 0) { phi[t] = phi[i] * prime[j]; break; }
phi[t] = phi[i] * (prime[j] - 1);
}
phi[i] = (phi[i] + phi[i-1]) % (P - 1);
}
}
int main() {
read(n); prework(n);
ll ans = 1, res = 1;
for (int i = 1;i <= n; i++)
res = res * i % P, ans = ans * fpw(i, (2 * phi[n/i] + 1) % (P - 1)) % P;
write(fpw(res, 2 * n % (P - 1)) * fpw(ans * ans % P, P - 2) % P);
return 0;
}