题目地址:点击打开链接
题目大意:很容易得到2^(n-1)%M
题目分析:由于n非常大,所以想办法快速幂,很容易T
1.第一个方案就是想起:FZU 1759点击打开链接
相关资料见:证明http://blog.csdn.net/u011613321/article/details/10208699
欧拉公式证明:http://wenku.baidu.com/view/7124c406b52acfc789ebc9ef.html###很有意思
但是!!!!这个方案死都T,这是什么情况啊,关键是我还将M=1e+7的phi直接带入啊
附上代码,欢迎斧正~~~,怎么会T?
结果……学姐帮忙看了下才发现,输入结束有误!!
~由于n>=1所以根本不会出现0,在样例完结时程序无法退出
#include<cstdio> #include<cstring> typedef long long LL; char b[1000010]; LL quick_pow(LL x,LL y,LL p) { LL ans=1; for (;y;y>>=1) { if (y&1) ans=(LL)ans*x%p; x=(LL)x*x%p; } return ans; } LL c=1e9+7,phi=1e9+6;//由于c为质数,所以phi很容易的为c-1,否则要用 int main() { LL a=2,x,y,k; while (1) { scanf("%s",b); if(b[0]=='0')/////-这儿出错了~~由于n>=1所以根本不会出现0,在样例完结时程序无法退出 break; x=y=0; LL len=strlen(b); for (LL i=0;i<len;i++) { x=x*10+b[i]-'0'; if (y==0&&x>=phi) y=phi; x%=phi; } k=(x+y-1+phi)%phi;//出现减法,所以为了防止负数出现 printf("%lld\n",quick_pow(a,k,c)); } return 0; }
所以代码更正后:
#include<cstdio> #include<cstring> typedef long long LL; char b[1000010]; LL quick_pow(LL x,LL y,LL p) { LL ans=1; for (;y;y>>=1) { if (y&1) ans=(LL)ans*x%p; x=(LL)x*x%p; } return ans; } LL c=1e9+7,phi=1e9+6;//由于c为质数,所以phi很容易的为c-1,否则要用 int main() { LL a=2,x,y,k; while (scanf("%s",b)!=-1) { x=y=0; LL len=strlen(b); for (LL i=0;i<len;i++) { x=x*10+b[i]-'0'; if (y==0&&x>=phi) y=phi; x%=phi; } k=(x+y-1+phi)%phi;//出现减法,所以为了防止负数出现 printf("%I64d\n",quick_pow(a,k,c)); } return 0; }
哭死了,一定要读题仔细啊
为了方便,顺便附上欧拉公式的代码
LL eular(LL k) { LL s=1; for (LL i=2;i*i<=k;i++) { if (k%i==0) { k=k/i,s*=(i-1); while (k%i==0) k=k/i,s*=i; } } if (k>1) s*=k-1; return s; }
2.回头想想,这么大的n必然是循环的否则一定会T 啊,循环节为(1e9+6)/2.
最后附上AC代码
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int MOD = 1e9 + 7; char str[100006]; __int64 quick_mod(__int64 k) { __int64 ans = 1; __int64 a = 2; while(k) { if(k&1) ans = (ans*a)%MOD; a = (a*a)%MOD; k >>= 1; } return ans; } int main() { while(~scanf("%s",str)) { int len = strlen(str); __int64 k = 0; for(int i = 0;i<len;i++) k = (k*10 + str[i] - '0')%500000003; k = (k -1 + 500000003)%500000003; printf("%I64d\n",quick_mod(k)); } return 0; }
总结:有些优秀的模板不是每到题都适用,重要的是能随机应变。