原式
a n s = ∏ i = 1 n ∏ j = 1 n l c m ( i , j ) gcd ( i , j ) ( m o d 104857601 ) ans = \prod\limits_{i=1}^n\prod\limits_{j = 1}^n\frac{lcm(i, j)}{ \gcd(i, j)}~~~(mod ~104857601) ans=i=1∏nj=1∏ngcd(i,j)lcm(i,j) (mod 104857601)
解法:
由于
l
c
m
(
i
,
j
)
=
i
∗
j
g
c
d
(
i
,
j
)
lcm(i, j) = \frac{i~*~j}{gcd(i,~j)}
lcm(i,j)=gcd(i, j)i ∗ j,原式可化为:
a
n
s
=
∏
i
=
1
n
∏
j
=
1
n
i
∗
j
gcd
2
(
i
,
j
)
(
m
o
d
104857601
)
ans = \prod\limits_{i=1}^n\prod\limits_{j = 1}^n\frac{i*j}{ \gcd^2(i, j)}~~~(mod~104857601)
ans=i=1∏nj=1∏ngcd2(i,j)i∗j (mod 104857601)
a n s = ( ∏ i = 1 n ∏ j = 1 n i ∗ j ) ∗ ( ∏ i = 1 n ∏ j = 1 n 1 gcd 2 ( i , j ) ) ( m o d 104857601 ) ans = (\prod\limits_{i=1}^n\prod\limits_{j = 1}^n{i*j})*(\prod\limits_{i=1}^n\prod\limits_{j = 1}^n\frac{1}{ \gcd^2(i, j)})~~~(mod ~104857601) ans=(i=1∏nj=1∏ni∗j)∗(i=1∏nj=1∏ngcd2(i,j)1) (mod 104857601)
前者容易看出:
p
r
e
=
∏
i
=
1
n
∏
j
=
1
n
i
∗
j
=
(
n
!
)
2
n
pre=\prod\limits_{i=1}^n\prod\limits_{j = 1}^n{i*j} = (n!)^{2n}
pre=i=1∏nj=1∏ni∗j=(n!)2n
后者由于最后结果取模,得到答案
l
a
s
t
=
i
n
v
(
T
)
∗
i
n
v
(
T
)
last = inv(T) * inv(T)
last=inv(T)∗inv(T) ,其中:
l
a
s
t
=
∏
i
=
1
n
∏
j
=
1
n
1
gcd
2
(
i
,
j
)
last=\prod\limits_{i=1}^n\prod\limits_{j = 1}^n\frac{1}{ \gcd^2(i, j)}
last=i=1∏nj=1∏ngcd2(i,j)1
T
=
∏
i
=
1
n
∏
j
=
1
n
g
c
d
(
i
,
j
)
T=\prod\limits_{i=1}^n\prod\limits_{j = 1}^{n}{gcd(i, j)}
T=i=1∏nj=1∏ngcd(i,j)
对 T T T进行化简,设 g c d ( i , j ) = d gcd(i,~j) = d gcd(i, j)=d ,对 d d d 进行枚举得:
∏ d = 1 m i n ( n , m ) d ∑ i = 1 n ∑ j = 1 n [ g c d ( i , j ) = = d ] \prod\limits_{d=1}^{min(n, ~m)}d^{\sum\limits_{i=1}^n\sum\limits_{j = 1}^{n}{[gcd(i, j)==d]}} d=1∏min(n, m)di=1∑nj=1∑n[gcd(i,j)==d]
由于:
①
∑
i
=
1
n
∑
j
=
1
n
[
g
c
d
(
i
,
j
)
=
=
x
]
=
∑
d
=
1
n
/
x
μ
(
d
)
⌊
n
d
x
⌋
2
①\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{n}[gcd(i,j)==x]=\sum\limits_{d=1}^{n/x}\mu(d)⌊\frac{n}{dx}⌋^2
①i=1∑nj=1∑n[gcd(i,j)==x]=d=1∑n/xμ(d)⌊dxn⌋2
② φ ( n ) = ∑ d ∣ n μ ( d ) ∗ ⌊ n d ⌋ ②\varphi(n)=\sum\limits_{d|n}\mu(d)*⌊\frac{n}{d}⌋ ②φ(n)=d∣n∑μ(d)∗⌊dn⌋
得 : ∑ i = 1 n ∑ j = 1 n g c d ( i , j ) = ∑ d = 1 n ∑ d ′ = 1 n φ ( d ′ ) = 2 ∑ d = 1 n / d φ ( d ) − 1 得:\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{n}gcd(i,j)=\sum\limits_{d=1}^{n}\sum\limits_{d'=1}^{n}\varphi(d')=2\sum\limits_{d=1}^{n/d}\varphi(d)-1~~~~ 得:i=1∑nj=1∑ngcd(i,j)=d=1∑nd′=1∑nφ(d′)=2d=1∑n/dφ(d)−1
于是有:已确保
(
n
<
m
)
(n < m)
(n<m)
T
=
∏
d
=
1
n
d
2
∑
d
′
=
1
n
/
d
φ
(
d
′
)
−
1
T=\prod\limits_{d=1}^{n}d^{2\sum\limits_{d'=1}^{n/d}\varphi(d')-1}
T=d=1∏nd2d′=1∑n/dφ(d′)−1
将上述式子结合得:
a
n
s
=
p
r
e
∗
l
a
s
t
=
p
r
e
∗
i
n
v
2
(
T
)
ans = pre*last=pre*inv^2(T)
ans=pre∗last=pre∗inv2(T)
a
n
s
=
(
n
!
)
2
n
∗
i
n
v
2
(
∏
d
=
1
n
d
2
∑
d
′
=
1
n
/
d
φ
(
d
′
)
−
1
)
ans = (n!)^{2n}*inv^2(\prod\limits_{d=1}^{n}d^{2\sum\limits_{d'=1}^{n/d}\varphi(d')-1})
ans=(n!)2n∗inv2(d=1∏nd2d′=1∑n/dφ(d′)−1)
=
(
n
!
)
2
n
∗
i
n
v
(
∏
d
=
1
n
d
2
∗
(
2
∑
d
′
=
1
n
/
d
φ
(
d
′
)
−
1
)
)
= (n!)^{2n}*inv(\prod\limits_{d=1}^{n}d^{2*(2\sum\limits_{d'=1}^{n/d}\varphi(d')-1)})
=(n!)2n∗inv(d=1∏nd2∗(2d′=1∑n/dφ(d′)−1))
因
为
2
∗
(
2
∑
d
′
=
1
n
/
d
φ
(
d
′
)
−
1
)
=
4
∑
d
′
=
1
n
/
d
φ
(
d
′
)
−
2
因为2*(2\sum\limits_{d'=1}^{n/d}\varphi(d')-1)=4\sum\limits_{d'=1}^{n/d}\varphi(d')-2
因为2∗(2d′=1∑n/dφ(d′)−1)=4d′=1∑n/dφ(d′)−2
所以可以对
∑
d
′
=
1
n
/
d
φ
(
d
′
)
\sum\limits_{d'=1}^{n/d}\varphi(d')
d′=1∑n/dφ(d′)记录前缀和.
代码:
//Siberian Squirrel
//C'est le vie
#include<bits/stdc++.h>
using namespace std;
//#define ACM_LOCAL
typedef long long ll;
#define printd(x) printf("%d\n", x)
#define printlld(x) printf("%lld\n", x)
#define printlf(x) printf("%.3f\n", x)
#define rep(i, l, r) for(int i = l, i##end = r; i <= i##end; ++i)
#define per(i, l, r) for(int i = l, i##end = r; i >= i##end; --i)
const int inf = 0x3f3f3f3f, MAXN = 1000001, MOD = 104857601;
//
int prime[100000], phi[MAXN], cnt = 0;
bool vis[MAXN];
//
int quick_pow(int ans, int p, int res = 1) {
for (; p; p >>= 1, ans = 1ll * ans * ans % MOD) {
if (p & 1) res = 1ll * res * ans % MOD;
}
return res % MOD;
}
int inv(int ans) {
return quick_pow(ans, MOD - 2);
}
void get_phi(int n) {//Acquisition de phi, fonction
phi[1] = 1;
for(int i = 2; i <= n; ++i) {
if(!vis[i]) prime[++cnt] = i, phi[i] = i - 1;
for(int j = 1; j <= cnt && i * prime[j] <= n; ++j) {
vis[i * prime[j]] = true;
if(i % prime[j] == 0) {
phi[i * prime[j]] = phi[i] * prime[j];
break;
} phi[i * prime[j]] = phi[i] * (prime[j] - 1);
}
}
for(int i = 2; i <= n; ++i) phi[i] = (phi[i - 1] + phi[i]) % (MOD - 1);
}
int main() {
int n, res = 1;
scanf("%d", &n);
get_phi(n);//Acquisition de phi, sum
int fac = 1, pre, T = 1;
for(int i = 2; i <= n; ++i) fac = 1ll * fac * i % MOD;
//fac = n!;
pre = quick_pow(fac, 1ll * 2 * n % (MOD - 1));
for(int d = 1; d <= n; ++d) {
int sum = 0;
T = 1ll * T * quick_pow(d ,1ll * 2 * (2 * phi[n / d] - 1) % (MOD - 1)) % MOD;
}
int invT = inv(T) % MOD;
res = 1ll * pre * invT % MOD;
printlld(res);
return 0;
}