重新求调(改了一些)
查看原帖
重新求调(改了一些)
553501
可爱的小棉羊楼主2024/2/26 16:40
#include<bits/stdc++.h>
using namespace std;
const int mod=1e9+7;
long long prime[400005],cnt;
long long n,sqr,tot,w[800005],g[800005],ind1[400005],ind2[400005],s,t,g_po[45];
bool vis[400005];
long long fpow(long long a,long long b){
	long long ans=1;
	while(b){
		if(b&1)ans=ans*a%mod;
		a=a*a%mod;
		b>>=1;
	}
	return ans;
}
void init(){
	vis[1]=1;
	for(int i=2;i<=sqr;i++){
		if(!vis[i])prime[++cnt]=i;
		for(int j=1;j<=cnt&&i*prime[j]<=sqr;j++){
			vis[i*prime[j]]=1;
			if(i%prime[j]==0)break;
		}
	}
	long long l=1;
	while(l<=n){
		long long r=(n/(n/l));
		tot++;
		w[tot]=n/l;
		g[tot]=(n/l-1);
		if(n/l<=sqr)ind1[n/l]=tot;
		else ind2[n/(n/l)]=tot;
		l=r+1;
	}
	
	for(int i=1;i<=cnt;i++){
		for(int j=1;j<=tot&&prime[i]*prime[i]<=w[j];j++){
			int k=w[j]/prime[i]<=sqr? ind1[w[j]/prime[i]]:ind2[n/(w[j]/prime[i])];
			g[j]=(g[j]-(g[k]-(i-1)));
		}
	}
//	for(int i=1;i<=tot;i++){
//		cout<<w[i]<<" "<<g[i]<<endl;
//	}
}
long long ans=1;
int getid(long long x){
	if(x<=sqr)return ind1[x];
	return ind2[n/x];
}
int main(){
	cin>>n>>s>>t;
	if(s==0){
		if(n==1)cout<<1<<endl;
		else cout<<0<<endl;
		return 0;
	}
	sqr=sqrt(n);
	init();
	g_po[1]=(fpow(1+s,t)+mod-2)%mod;
	for(int i=2;i<=40;i++){
		g_po[i]=(fpow(1+i*s,t)%mod-2*fpow(1+(i-1)*s,t)%mod+fpow(1+(i-2)*s,t)%mod+2*mod)%mod;
		//3
		//-2+4
	}
	//for(int i=1;i<=40;i++)cout<<g_po[i]<<endl;
	for(int i=1;i<=cnt&&n/prime[i]>n/sqr;i++){
		long long pe=prime[i];
		for(int e=1;pe<=n;pe*=prime[i],e++){
			ans=ans*fpow(g_po[e],(n/pe-n/(pe*prime[i])))%mod;
			//
			
		}
	}
	long long po=0;
	for(int i=1;i<=n/sqr;i++){
		long long cnt=g[getid(n/i)]-g[getid(n/(i+1))];
		po+=1ll*i*cnt;
	}
	ans=ans*fpow(g_po[1],po)%mod;
	cout<<ans<<endl;
	
}
//g(2)=(1+1)^2-2=2
//g(1)=1; 
2024/2/26 16:40
加载中...