萌新30分被卡空间求助
  • 板块P5221 Product
  • 楼主charm1
  • 当前回复2
  • 已保存回复2
  • 发布时间2021/4/2 09:12
  • 上次更新2023/11/5 01:10:57
查看原帖
萌新30分被卡空间求助
135258
charm1楼主2021/4/2 09:12

RT

#include <bits/stdc++.h>
using namespace std;
const int maxm=400005;
const int maxn=2000005;
const int dd=104857601;
int n,cnt;
short mu[maxn];
int sum2[maxn],sum3[maxn],prime[maxm];
bool p[maxn];
inline int read() {
	int ret=0,f=1;
	char ch=getchar();
	while(!isdigit(ch)) {
		if(ch=='-')f=-f;
		ch=getchar();
	}
	while(isdigit(ch)) {
		ret=ret*10+ch-'0';
		ch=getchar();
	}
	return ret*f;
}
int qpow(int x,int p) {
	int ans=1;
	if(p<0)	p+=dd-1;
	while(p) {
		if(p&1)	ans=1ll*ans*x%dd;
		p>>=1;
		x=1ll*x*x%dd;
	}
	return ans;
}
int inv(int x) {
	return qpow(x,dd-2);
}
void prework() {
	n=read();
	sum2[0]=sum2[1]=sum3[0]=sum3[1]=1;
	mu[1]=1;	prime[0]=0;
	for(int k=2;k<=n;k++)
	{
		if(!p[k])
		{
			prime[++cnt]=k;
			mu[k]=-1;
		}
		for(int j=1;j<=cnt&&k<=n/prime[j];j++)
		{
			p[k*prime[j]]=1;
			if(k%prime[j]==0)
			{
				mu[k*prime[j]]=0;
				break;
			}
			mu[k*prime[j]]=-mu[k];
		}
		sum3[k]=1ll*sum3[k-1]*qpow(k,mu[k])%dd;
		mu[k]+=mu[k-1];
		sum2[k]=1ll*sum2[k-1]*k%dd;
	}
}
int calc(int n) {
	long long ans=1;
	for(int l=1,r; l<=n; l=r+1) {
		r=n/(n/l);
		ans=ans*qpow(sum2[n/l],1ll*(mu[r]-mu[l-1])*(n/l)%(dd-1))%dd;
		ans=ans*qpow(1ll*sum3[r]*inv(sum3[l-1])%dd,1ll*(n/l)*(n/l)%(dd-1))%dd;
//		cout<<sum2[n/l]<<" "<<s<<" "<<sum3[r]*inv(sum3[l-1])%dd<<" "<<p<<endl;
	}
//	cout<<n<<" "<<ans<<endl;
	return ans;
}
void solve() {
	long long ans=1;
	for(int l=1,r; l<=n; l=r+1) {
		r=n/(n/l);
		ans=ans*qpow(calc(n/l),r-l+1)%dd;
	}
	printf("%lld\n",ans*ans%dd);
}
signed main() {
	prework();
	solve();
	return 0;
}
2021/4/2 09:12
加载中...