求2的n次方對1e9+7的模,n大約為10的100000次方(費馬小定理)


  昨天做了一個題,簡化題意后就是求2的n次方對1e9+7的模,其中1<=n<=10100000。這個就算用快速冪加大數也會超時,查了之后才知道這類題是對費馬小定理的考察。

  費馬小定理:假如p是質數,且gcd(a,p)=1(a,p互質),那么 a^(p-1)≡1(mod p)。


由題可知,1e9+7是個質數(許多結果很大的題都喜歡對1e9+7取模),2是整數,a與p互質顯而易見,所以現在我們的目的就是想辦法把2^n%(1e9+7)降冪為2^k%(1e9+7),令p=1e9+7,已知a^(p-1) = 1(mod p),且n可能很大很大,就看n里包括多少個p-1,把這些都丟掉求剩下的就好(就是求n mod (p-1),根據取模的性質,這個過程可以將n從第一個數展開過程中邊取模完成,詳見代碼)。假設有x個p-1,則:2^n = 2^(x*(p-1)) * 2^k = 1^x * 2^k = 2^k(mod p),所以直接求2^k就好,k = n%(p-1)。
由於N過於長,就用字符串存儲,之后邊轉化為數邊取余。還有就是處理過后的N也不小,求次冪時需要用快速冪。

 1 #include<cstdio>
 2 #include<string>
 3 #include<iostream>
 4 #include<algorithm>
 5 using namespace std;
 6 
 7 typedef long long LL;
 8 string n;
 9 const LL mod=1000000007;
10 
11 LL QuickPower(LL a,LL b){
12     LL ans=1;
13     while(b){
14         if(b&1){
15             ans=(ans*a)%mod;
16         }
17         b>>=1;
18         a=(a*a)%mod;
19     }
20     return ans;
21 }
22 
23 int main(){
24     cin>>n;
25     LL k=(LL)(n[0]-'0'),mod1=mod-1;
26     for(int i=1;i<n.length();i++)
27         k=(k*10+(LL)(n[i]-'0'))%mod1;
28     printf("%lld\n",QuickPower(2,k));
29     return 0;
30 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM