1.二分递归:
使用a*b(mod n)=(a(mod n)*b(mod n))(mod n)即可。
#include<stdio.h> /* 错误 long long fun(long long a,long long b,long long c) { long long temp; if(0==b) return 1; temp=fun(a,b/2,c); if(b&1) return temp*a%c; return temp; } */ /* AC long long fun(long long x,long long y,long long p) { long long t=x; long long ans=1; while(y) { if(y&1) ans=t*ans%p; t=t*t%p; y=y>>1; } return (int)ans; } */ long long fun(long long a,long long b,long long c) { long long temp,ans; if(0==b) return 1; temp=fun(a,b/2,c); ans=temp*temp%c; if(b&1) return ans*a%c; return ans; } /* TLE long long fun(long long a,long long b,long long c) { long long temp,ans; int i; ans=a%c,temp=1; for(i=0;i<b;i++) temp=(ans*temp)%c; return temp; } */ int main() { int i,T;int num; long long a,b,c; scanf("%d",&T); while(T--) { scanf("%lld%lld%lld",&a,&b,&c); printf("%lld\n",fun(a,b,c)); } return 0; }
2.s = (p ^ e) mod n = ((p mod n) ^ e) mode n。
所以,只需要对p除以n的余数进行e次方的运算,而且每运算一步都进行一次取模就可以了。
做密码的程序需要一点数论基础。