1. 程式人生 > >2991:2011 (數學)

2991:2011 (數學)

\n num include 同余 mes 算法 pre bit 數學

【題目描述】

    已知長度最大為200位的正整數n,請求出2011^n的後四位。

【題目鏈接】

    http://noi.openjudge.cn/ch0204/2991/

【算法】

    一開始想的是把n轉換成二進制,然後快速冪,但要用到高精度除法,很煩。容易發現2011的501次方mod10000後為2011,所以2011的n次方和2011的n%500次方膜10000同余,而n%500和n的後三位的數%500結果應該相同,然後快速冪結束。(註意:strlen()返回值是size_t無符號的整數,要轉換成有符號)

【代碼】

 1 #include <bits/stdc++.h>
 2 using namespace std;
3 int t,num,ans,b,i; 4 char a[210]; 5 int main() 6 { 7 scanf("%d",&t); 8 while(t--) { 9 num=0; 10 ans=1; 11 b=2011; 12 scanf("%s",a); 13 for(i=(int)strlen(a)-3;i<(int)strlen(a);i++) if(i>=0) num=num*10+a[i]-0; 14 num%=500; 15 for
(;num;num>>=1) { 16 if(num&1) ans=(long long)ans*b%10000; 17 b=(long long)b*b%10000; 18 } 19 printf("%d\n",ans); 20 } 21 }

2991:2011 (數學)