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;  

}  


 

 

你可能感兴趣的:(HDU)