hdu 4704 费马小定理+普通快速幂

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

这样就可以知道,题目的目的是求2^(n-1)%Mod的结果.....此时想,应该会想到快速幂...

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

#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;  
}  


你可能感兴趣的:(hdu 4704 费马小定理+普通快速幂)