莫比乌斯反演3

题目戳这里(洛谷P5221)

原式

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=1nj=1ngcd(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=1nj=1ngcd2(i,j)ij   (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=1nj=1nij)(i=1nj=1ngcd2(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=1nj=1nij=(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=1nj=1ngcd2(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=1nj=1ngcd(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=1min(n, m)di=1nj=1n[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=1nj=1n[gcd(i,j)==x]=d=1n/xμ(d)dxn2

② φ ( n ) = ∑ d ∣ n μ ( d ) ∗ ⌊ n d ⌋ ②\varphi(n)=\sum\limits_{d|n}\mu(d)*⌊\frac{n}{d}⌋ φ(n)=dnμ(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=1nj=1ngcd(i,j)=d=1nd=1nφ(d)=2d=1n/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=1nd2d=1n/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=prelast=preinv2(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!)2ninv2(d=1nd2d=1n/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!)2ninv(d=1nd2(2d=1n/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=1n/dφ(d)1)=4d=1n/dφ(d)2
所以可以对 ∑ d ′ = 1 n / d φ ( d ′ ) \sum\limits_{d'=1}^{n/d}\varphi(d') d=1n/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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值