数论板子合集。。。
我们要求:
$N^{sumlimits_{i=1}^{N}[gcd(i,N)==1]C_{n}^{i}}mod p$
其中p为54184622,是个合数
指数是组合数,不能用快速幂,只能mod phi(p),phi(p)=p-1,而p-1不是质数,要用crt合并
#include<iostream> #include<cstdio> #include<cstring> #include<queue> #include<stack> #include<cmath> #include<algorithm> #define mod 54184622 #define int long long #define MAXN 1000005 using namespace std; int n,g,a[7],prime[7]={0,2,3,5,7,129011}; int fac[7][MAXN],ans; int q_pow(int a,int b,int p){ int res=1; while(b){ if(b&1) res=(res*a)%p; a=(a*a)%p; b>>=1; } return res%p; } int gcd(int a,int b){ return b==0?a:gcd(b,a%b); } int C(int n,int m,int p){ if(n==m) return 1; if(m>n) return 0; return fac[p][n]*q_pow(fac[p][m]*fac[p][n-m]%prime[p],prime[p]-2,prime[p]); } int lucas(int n,int m,int p){ if(m==0) return 1; return lucas(n/prime[p],m/prime[p],p)%mod*C(n%prime[p],m%prime[p],p)%prime[p]; } int crt(){ int p=27092310,res=0; for(int i=1;i<=5;i++) res=(res+p/prime[i]*a[i]%p*q_pow(p/prime[i],prime[i]-2,prime[i])%p)%p; return res; } signed main(){ scanf("%lld %lld",&n,&g); for(int i=1;i<=5;i++){ fac[i][0]=1; for(int j=1;j<=prime[i];j++) fac[i][j]=fac[i][j-1]*j%prime[i]; } for(int i=1;i<=min(n,g);i++){ if(gcd(i,n)!=1) continue; for(int j=1;j<=5;j++){ a[j]=(a[j]+lucas(g,i,j))%prime[j]; } } ans=crt(); printf("%lld ",q_pow(n,ans,mod)); return 0; }