大数取模 快速幂 欧拉定理 欧拉函数

求a^b%mod a<=1e12 b<=1e100000 mod=1e9+7

已知欧拉定理 a^φ(n) ≡1%n(a与n互质)

b%φ(n)=t

b=k*φ(n)+t(k=0,1,2,3...)

a^b%mod=a^(K*φ(n)+t)%mod=(a^(k*φ(n))%mod)*a^t%mod)%mod=a^t%mod
(a^φ(n) ≡1%n=1, a^(k*a^φ(n) )=1;原式=(1*a^t)%mod )
用欧拉函数求出φ(n) b对φ(n)取模即可求出t
a^b%mod=a^t%mod;
欧拉函数:
 1 ll euler(ll n){ //返回euler(n)   
 2      ll res=n,a=n;  
 3      for(ll i=2;i*i<=a;i++){  
 4          if(a%i==0){  
 5              res=res/i*(i-1);//先进行除法是为了防止中间数据的溢出   
 6              while(a%i==0) a/=i;  
 7          }  
 8      }  
 9      if(a>1) res=res/a*(a-1);  
10      return res;  
11 }  

快速幂:

 1 ll PowerMod(ll a, ll b, ll mod){
 2     ll ans=1;
 3     a%=mod;
 4     while(b){
 5         if(b&1) ans=(ans*a)%mod;
 6         b>>=1;
 7         a=(a*a)%mod;
 8     }
 9     return ans;
10 }

大数取模:

1 ll MOD(char *s,ll m){
2     ll len = strlen(s);
3     ll ans = 0;
4     for(ll i = 0; i < len; i++)
5         ans = (( ans*10 + s[i] - '0') % m);
6     return ans;
7 }

 

posted on 2016-11-23 18:56  lazzzy  阅读(871)  评论(0编辑  收藏  举报

导航