ZOJ 2674 Strange Limit
欧拉函数。
#include<iostream> #include<stdio.h> #include<string.h> #include<algorithm> #define MAXSIZE 100003 #define N 100003 using namespace std; long long prime[10030]; long long flag[100003]; long long cn; void sushu() { memset(flag,0,sizeof(flag)); cn=0; long long i,j; for (i=2;i<MAXSIZE+1;i++) { if(!flag[i]) prime[cn++]=i; for(j=0;(j<cn)&&(prime[j]*i<MAXSIZE+1);j++) { flag[i*prime[j]]=1; } } } long long fast(long long a,long long p,long long m) { long long r,k; if(p==0) return 1%m; else if(p==1) return a%m; r=a%m; k=1; while(p>1) { if((p&1)!=0) k=(k*r)%m; r=(r*r)%m; p>>=1; } return (r*k)%m; } long long fac(long long m) { long long i,res=1; for(i=m;i>=1;i--) res*=i; return res; } long long ola(long long n) { long long i,n1=n; long long res=n; for(i=0;(i<cn)&&prime[i]*prime[i]<=n;i++) { if(n%prime[i]==0) { res=res/prime[i]*(prime[i]-1); while(n1%prime[i]==0) n1/=prime[i]; } } if(n1!=1) res=res/n1*(n1-1); return res; } long long solve(long long a,long long m) { if(m==1) return 0; else { long long tmp=ola(m); //phi[m]; //euler(m); return fast(a,tmp,m)*fast(a,solve(a,tmp),m); } } int main() { long long m,m1; long long p; sushu(); bool tag=false; while(scanf("%lld%lld",&p,&m1)!=EOF) { if(tag) { puts(""); } else tag=true; m=fac(m1); printf("%lld\n",solve(p,m)%m); } return 0; }
作者:whatbeg
出处1:http://whatbeg.com/
出处2:http://www.cnblogs.com/whatbeg/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
更多精彩文章抢先看?详见我的独立博客: whatbeg.com