记录编号 456801 评测结果 AAAAAAAAAA
题目名称 [HZOI 2016]艾米利亚的魔法 最终得分 100
用户昵称 GravatarAnonymity 是否通过 通过
代码语言 C++ 运行时间 9.728 s
提交时间 2017-10-05 16:48:37 内存使用 46.07 MiB
显示代码纯文本
#include <cstdio>
#define maxn 1000005
typedef long long ll;
int n,G,Falsemod=54184622,fans,Truemod=27092310,A[6],M[6],minv[6],inv[6][maxn],xp[6][maxn],list[6]={0,2,3,5,7,129011};
inline int gcd(int x,int y){return !y?x:gcd(y,x%y);}
inline int qp(int x,int y,int mod)
{	ll ans=1;x%=mod;
	for(;y;y>>=1,x=(ll)x*x%mod) if(y&1) ans=(ll)ans*x%mod;
	return ans;
}
inline void init()
{	for(int i=1;i<=5;++i)
	{	xp[i][0]=1;inv[i][0]=1;
		for(int j=1;j<=G;++j) xp[i][j]=(ll)xp[i][j-1]*j%list[i];
		for(int j=1;j<=G;++j) inv[i][j]=qp(xp[i][j],list[i]-2,list[i]);
	}
	for(int i=1;i<=5;++i) M[i]=Truemod/list[i],minv[i]=qp(M[i],list[i]-2,list[i]);
}
inline int C(int x,int y,int mod,int pos){return (ll)xp[pos][x]*inv[pos][y]%mod*inv[pos][x-y]%mod;}
inline int lucas(int x,int y,int mod,int pos)
{	if(!y) return 1;
	return C(x%mod,y%mod,mod,pos)*lucas(x/mod,y/mod,mod,pos)%mod;
}
inline int CRT(int x,int y)
{	if(y>x) return 0;ll tmp=0;
	for(int i=1;i<=5;++i) A[i]=lucas(x,y,list[i],i);
	for(int i=1;i<=5;++i) tmp=(tmp+(ll)A[i]*M[i]*minv[i])%Truemod;
	return tmp;
}
int main()
{	freopen("aimiliyademagic.in","r",stdin);
	freopen("aimiliyademagic.out","w",stdout);
	scanf("%d%d",&n,&G);
	init();
	for(int i=1;i<=n;++i)
		if(gcd(i,n)==1)
			fans=((ll)fans+CRT(G,i))%Truemod;
	printf("%d",qp(n,fans+Truemod,Falsemod));
	return 0;
}