题目
求∏i=1n∏j=1nlcm(i,j)gcd(i,j)\prod_{i=1}^n\prod_{j=1}^n\frac{lcm(i,j)}{gcd(i,j)}i=1∏nj=1∏ngcd(i,j)lcm(i,j)
分析
又是一波推式子的过程
=∏i=1n∏j=1nij1gcd(i,j)2=\prod_{i=1}^n\prod_{j=1}^nij\frac{1}{gcd(i,j)^2}=i=1∏nj=1∏nijgcd(i,j)21
=(n!)2n(∏i=1n∏j=1ngcd(i,j))−2=(n!)^{2n}(\prod_{i=1}^n\prod_{j=1}^ngcd(i,j))^{-2}=(n!)2n(i=1∏nj=1∏ngcd(i,j))−2
=(n!)2n(∏d=1n∏i=1n∏j=1n[gcd(i,j)==d])=(n!)^{2n}(\prod_{d=1}^n\prod_{i=1}^n\prod_{j=1}^n[gcd(i,j)==d])=(n!)2n(d=1∏ni=1∏nj=1∏n[gcd(i,j)==d])
=(n!)2n(∏d=1nd∏i=1⌊nd⌋∏j=1⌊nd⌋[gcd(i,j)==1])=(n!)^{2n}(\prod_{d=1}^nd\prod_{i=1}^{\lfloor\frac{n}{d}\rfloor}\prod_{j=1}^{\lfloor\frac{n}{d}\rfloor}[gcd(i,j)==1])=(n!)2n(d=1∏ndi=1∏⌊dn⌋j=1∏⌊dn⌋[gcd(i,j)==1])
=(n!)2n(∏d=1nd∑i=1⌊nd⌋∑j=1⌊nd⌋[gcd(i,j)==1])\large =(n!)^{2n}(\prod_{d=1}^nd^{\sum_{i=1}^{\lfloor\frac{n}{d}\rfloor}\sum_{j=1}^{\lfloor\frac{n}{d}\rfloor}[gcd(i,j)==1]})=(n!)2n(d=1∏nd∑i=1⌊dn⌋∑j=1⌊dn⌋[gcd(i,j)==1])
指数就是2∗φ(⌊nd⌋)−12*\varphi(\lfloor\frac{n}{d}\rfloor)-12∗φ(⌊dn⌋)−1
就可以O(n)求解了
代码
#include <cstdio>
#define rr register
using namespace std;
const int mod=104857601,N=1000101;
int n,phi[N],prime[N],cnt;
inline signed ksm(int x,int y){
rr int ans=1;
for (;y;y>>=1,x=1ll*x*x%mod)
if (y&1) ans=1ll*ans*x%mod;
return ans;
}
signed main(){
scanf("%d",&n); int ans=1,ans1=1;
for (rr int i=1;i<=n;++i) phi[i]=i;
for (rr int i=2;i<=n;++i){
if (phi[i]==i) prime[++cnt]=i,phi[i]=i-1;
for (rr int j=1;j<=cnt&&prime[j]*i<=n;++j){
if (i%prime[j]==0){
phi[i*prime[j]]=phi[i]*prime[j];
break;
}
phi[i*prime[j]]=phi[i]*(prime[j]-1);
}
ans=1ll*ans*i%mod;
}
for (rr int i=1;i<=n;++i) phi[i]=(phi[i-1]+phi[i]*2)%(mod-1); ans=ksm(ans,n<<1);
for (rr int i=2;i<=n;++i) ans1=1ll*ans1*ksm(i,phi[n/i]-1)%mod;
return !printf("%d",1ll*ans*ksm(ans1,mod-3)%mod);
}
1149

被折叠的 条评论
为什么被折叠?



