hdu 4704(费马小定理)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4704

思路:一道整数划分题目,不难推出公式:2^(n-1),根据费马小定理:(2,MOD)互质,则2^(p-1)%p=1,于是我们可以转化为:2^(n-1)%MOD=2^((n-1)%(MOD-1))%MOD,从而用快速幂求解。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 using namespace std;
 6 #define MOD 1000000007
 7 
 8 char str[100100];
 9 long long Pow(long long n)
10 {
11     long long p=1,q=2;
12     while(n){
13         if(n&1){
14             p=p*q%MOD;
15         }
16         n>>=1;
17         q=q*q%MOD;
18     }
19     return p;
20 }
21 
22 int main()
23 {
24     while(~scanf("%s",str)){
25         int len=strlen(str);
26         long long n=0;
27         for(int i=0;i<len;i++){
28             n=(n*10+str[i]-'0')%(MOD-1);
29         }
30         printf("%I64d\n",Pow(n-1));
31     }
32     return 0;
33 }
View Code

 

posted @ 2013-08-23 11:05  ihge2k  阅读(582)  评论(0编辑  收藏  举报