题意
求
∏ i = 1 n ∏ j = 1 n lcm ( i , j ) gcd ( i , j ) \prod_{i=1}^{n}\prod^{n}_{j=1}\frac{\text{lcm}(i,j)}{\gcd(i,j)} i=1∏nj=1∏ngcd(i,j)lcm(i,j)
对 104857601 104857601 104857601 取模
1 ≤ n ≤ 1 0 6 1 \le n \le 10^6 1≤n≤106
分析:
将 lcm ( i , j ) = i ⋅ j gcd ( i , j ) \text{lcm}(i,j)=\dfrac{i \cdot j}{\gcd(i,j)} lcm(i,j)=gcd(i,j)i⋅j 替换原式得
∏ i = 1 n ∏ j = 1 n i ⋅ j gcd ( i , j ) 2 \prod_{i=1}^{n}\prod^{n}_{j=1}\frac{i \cdot j}{\gcd(i,j)^2} i=1∏nj=1∏ngcd(i,j)2i⋅j
对 gcd ( i , j ) 2 \gcd(i,j)^2 gcd(i,j)2 求逆元
∏ i = 1 n ∏ j = 1 n i ⋅ j ⋅ gcd ( i , j ) − 2 \prod_{i=1}^{n}\prod^{n}_{j=1}i \cdot j \cdot \gcd(i,j)^{-2} i=1∏nj=1∏ni⋅j⋅gcd(i,j)−2
前后分开来看
∏ i = 1 n ∏ j = 1 n i ⋅ j ∏ i = 1 n ∏ j = 1 n gcd ( i , j ) − 2 \prod_{i=1}^{n}\prod^{n}_{j=1}i \cdot j\prod_{i=1}^{n}\prod^{n}_{j=1}\gcd(i,j)^{-2} i=1∏nj=1∏ni⋅ji=1∏nj=1∏ngcd(i,j)−2
前面 ∏ i = 1 n ∏ j = 1 n i ⋅ j = ∏ i = 1 n i n ∏ j = 1 n j = ∏ i = 1 n i n ⋅ n ! = ( n ! ) n ∏ i = 1 n i n = ( n ! ) 2 n \prod\limits_{i=1}^{n}\prod\limits^{n}_{j=1}i \cdot j=\prod\limits_{i=1}^{n}i^n\prod\limits^{n}_{j=1}j=\prod\limits_{i=1}^{n}i^n\cdot n!=(n!)^{n}\prod\limits_{i=1}^{n}i^n=(n!)^{2n} i=1∏nj=1∏ni⋅j=i=1∏ninj=1∏nj=i=1∏nin⋅n!=(n!)ni=1∏nin=(n!)2n
后半部分 先看原来的值再求逆元
∏ i = 1 n ∏ j = 1 n gcd ( i , j ) 2 \prod_{i=1}^{n}\prod^{n}_{j=1}\gcd(i,j)^{2} i=1∏nj=1∏ngcd(i,j)2
先把平方拿出去看里面
∏ i = 1 n ∏ j = 1 n gcd ( i , j ) \prod_{i=1}^{n}\prod^{n}_{j=1}\gcd(i,j) i=1∏nj=1∏ngcd(i,j)
枚举 gcd ( i , j ) \gcd(i,j) gcd(i,j)
∏ d = 1 n d ∑ i = 1 n ∑ j = 1 n [ gcd ( i , j ) = d ] \prod_{d=1}^{n}d^{\sum\limits_{i=1}^{n}\sum\limits^{n}_{j=1}[\gcd(i,j)=d]} d=1∏ndi=1∑nj=1∑n[gcd(i,j)=d]
指数部分 因为 ∑ i = 1 n ∑ i = 1 n [ gcd ( i , j ) = 1 ] = 2 ∑ i = 1 n φ ( i ) − 1 \sum\limits_{i=1}^{n}\sum\limits_{i=1}^{n}[\gcd(i,j)=1]=2\sum\limits_{i=1}^{n}\varphi(i)-1 i=1∑ni=1∑n[gcd(i,j)=1]=2i=1∑nφ(i)−1 所以
∏ d = 1 n d 2 ∑ i = 1 ⌊ n d ⌋ φ ( i ) − 1 \prod_{d=1}^{n}d^{2\sum\limits_{i=1}^{\lfloor\frac{n}{d} \rfloor}\varphi(i)-1} d=1∏nd2i=1∑⌊dn⌋φ(i)−1
最后答案为
( n ! ) 2 n ⋅ ( ∏ d = 1 n d 2 ∑ i = 1 ⌊ n d ⌋ φ ( i ) − 1 ) − 2 (n!)^{2n}\cdot (\prod_{d=1}^{n}d^{2\sum\limits_{i=1}^{\lfloor\frac{n}{d} \rfloor}\varphi(i)-1})^{-2} (n!)2n⋅(d=1∏nd2i=1∑⌊dn⌋φ(i)−1)−2
代码(毒瘤出题人卡空间):
#include <cstdio>
using namespace std;
const int N = 1e6 + 5, mod = 104857601;
int n, fact = 1, euler[N], primes[N], cnt, res = 1, inv = 1;
bool st[N];
int qmi(int a, int b) {
int res = 1;
while (b) {
if (b & 1) res = 1ll * res * a % mod;
a = 1ll * a * a % mod;
b >>= 1;
}
return res;
}
void get_eulers(int n) {
euler[1] = 1;
for (int i = 2; i <= n; i ++) {
if (!st[i]) {
primes[cnt ++] = i;
euler[i] = i - 1;
}
for (int j = 0; primes[j] * i <= n; j ++) {
int t = primes[j] * i;
st[t] = 1;
if (i % primes[j] == 0) {
euler[t] = euler[i] * primes[j];
break;
}
euler[t] = euler[i] * (primes[j] - 1);
}
}
for (int i = 1; i <= n; i ++) euler[i] = (euler[i - 1] + 2 * euler[i]) % (mod - 1);
}
signed main() {
scanf("%d", &n);
get_eulers(n);
for (int i = 1; i <= n; i ++) fact = 1ll * fact * i % mod;
res = qmi(fact, 2 * n);
for (int i = 1; i <= n; i ++) {
inv = (1ll * inv * qmi(i, euler[n / i] - 1)) % mod;
}
printf("%d\n", 1ll * res * qmi(1ll * inv * inv % mod, mod - 2) % mod);
}