2008年趣题一道
(2008个1)的(2008个1)次方 mod 2008 =?2008个1就是 11...1 一共2008位
闲着没事自己想的题目,哈哈
int modExp_bigint(a,b,k) { int res=1; int y=a mod k;// O( length(a) ) while(b>0){ //O( length(b) ) r=b mod 10; //如果b是按照10进制存储 ,这里只需取一位 O(1) res=res*modExp_int(y,r,k) mod k; //O(log r)<O(log10)=O(1) y=modExp_int(y,10,k); //O(log10)=O(1) b/=10; //如果b是按照10进制存储 ,这里只需移动指针 O(1) } return res; }
#include <iostream> using namespace std; int modExp_int(int a,int b,int m) { int t=1,y=a%m; while(b){ if(b&1){ t=t*y%m; } y=y*y%m; b=(b>>1); } return t; } int modExp2008() { int res=1,y=0; for(int i=0;i<2008;i++){ y=(y*10+1)%2008; } for(int i=0;i<2008;i++){ res=res*modExp_int(y,1,2008)%2008; y=modExp_int(y,10,2008); } return res; } int modExp2008v2() { int a=0; for(int i=0;i<2008;i++){ a=(a*10+1)%2008; } return modExp_int(a,111,2008); } int main() { printf("%d\n",modExp2008()); printf("%d\n",modExp2008v2()); system("pause"); }