luogu P5221 Product |莫比乌斯反演
题目背景
\({\rm CYJian}\):"听说\(gcd\)和\(\sum\)套起来比较好玩??那我就......"
题目描述
\({\rm CYJian}\)最近闲的玩起了\(gcd\)。。他想到了一个非常简单而有意思的式子:
\(\prod_{i=1}^N\prod_{j=1}^N\frac{lcm(i,j)}{gcd(i,j)}\ (\bmod\ 104857601)\) (mod 104857601)
\({\rm CYJian}\)已经算出来这个式子的值了。现在请你帮他验算一下吧。\({\rm CYJian}\)只给你\(0.2s\)的时间哦。
输入格式
一行一个正整数\(N\)。
输出格式
一行一个正整数,表示答案模\(104857601\)的值。
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
inline int read(){
int x=0; char c=getchar();
while(c<'0'||c>'9')c=getchar();
while(c>='0'&&c<='9'){x=(x<<1)+(x<<3)+(c^48); c=getchar();}
return x;
}
#define ll long long
const int N=1e6+5,mod=104857601;
short mu[N];
int pri[N],tot;
bool vis[N];
inline void Mubius(int n){
mu[1]=1;
for(int i=2;i<=n;i++){
if(!vis[i]){ pri[++tot]=i; mu[i]=-1; }
for(int j=1;j<=tot&&pri[j]*i<=n;j++){
vis[pri[j]*i]=1;
if(i%pri[j])mu[i*pri[j]]=-mu[i];
else { mu[i*pri[j]]=0; break; }
}
}
for(int i=2;i<=n;i++)mu[i]+=mu[i-1];
}
inline ll sum(int n){
ll ans=0;
for(int i=1,j=0;i<=n;i=j+1){
j=n/(n/i);
ans+=1ll*(mu[j]-mu[i-1])*(n/i)*(n/i);
}
return ans;
}
inline ll ksm(ll x,ll y){
int res=1;
while(y){
if(y&1)res=res*x%mod;
x=x*x%mod; y>>=1;
}
return res;
}
signed main(){
int n=read();
Mubius(n);
ll ans=1,op=1;
for(int i=1;i<=n;i++){
ans=ans*ksm(i,sum(n/i))%mod;
op=op*i%mod;
}
cout<<ksm(ans*ans%mod,mod-2)*ksm(op,2*n)%mod<<endl;
}
不以物喜,不以己悲