luogu P5221 Product |莫比乌斯反演

题目背景

({ m CYJian}):"听说(gcd)(sum)套起来比较好玩??那我就......"
题目描述

({ m CYJian})最近闲的玩起了(gcd)。。他想到了一个非常简单而有意思的式子:

(prod_{i=1}^Nprod_{j=1}^Nfrac{lcm(i,j)}{gcd(i,j)} (mod 104857601)) (mod 104857601)

({ m CYJian})已经算出来这个式子的值了。现在请你帮他验算一下吧。({ m 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;
}
原文地址:https://www.cnblogs.com/naruto-mzx/p/13150949.html