hdu 4704 同余定理+普通快速幂

此题往后推几步就可找到规律,从1开始,答案分别是1,2,4,8,16....

这样就可以知道,题目的目的是求2^n%Mod的结果.....此时想,应该会想到快速幂...然后接着会发现,由于n的值过大,很容易就会T掉...

所以这个时候就想到找规律...试试就可以知道,1e9+6的时候是循环节...

然后用同余定理,把余数求出来就可以了...

 

#include<iostream>  
#include<string>  
#include<string.h>  
#include<cstdio>  
#include<algorithm>  
using namespace std;  
#define Mod 1000000007
__int64 quick_pow(__int64 m,__int64 n)
{
    __int64 ans=1;
    while(n){
        if(n&1) 
            ans=(ans*m)%Mod;
        n=n>>1;
        m=(m*m)%Mod;
    }
    return ans;
}


int main()  
{  
    __int64 N, i, num, len;  
        char str[1000010];  
        while(~scanf("%s", str)){  
         num = 0;  
        len = strlen(str);  
        for(i = 0; i != len; ++i)  //同余定理
        {  
            num = (num * 10 + (int)(str[i] - '0')) % 1000000006;   
        }  
        __int64 ans;
        if(num==0){
		printf("%I64d\n",quick_pow(2,Mod-2));
		}
		else{
  		num--;
		ans=quick_pow(2,num);
        printf("%I64d\n",ans);  
		}
		}
    return 0;  
}  


 

 

posted on 2013-08-22 17:52  you Richer  阅读(264)  评论(0编辑  收藏  举报