HDU 2837 Calculation (指数循环节)
来源:互联网 发布:手机视频解码软件 编辑:程序博客网 时间:2024/05/16 05:02
题目大意,已知f(0) = 1 且 f(n) = (n%10)^f(n/10) ,
输入n,m, 输出 f(n)%m ---- (2 ≤ n , m ≤ 10^9)
要应用到一道公式
其中phi()为欧拉函数,当条件成立时,可以利用该公式进行加速幂
AC大神的blog有对于此公式的详细证明: http://hi.baidu.com/aekdycoin/blog/item/b6f1762565bb403fc8955908.html
然后注意公式使用的条件,注意一下0^0=1, 处理好细节就能过了
当然我没试过单纯快速幂能不能过,应该是没什么问题的,感觉这题数据强度不是太大
不过对于HDU 3609 和 09上海区预赛B题,(hdu 3221), 就必须用到了
#include<iostream>using namespace std;char n[10];int m[10];__int64 eular(__int64 num){ __int64 ret=1; for(int i=2;i*i<=num;i++) { if(num%i==0) { num/=i;ret*=i-1; while(num%i==0) {num/=i;ret*=i;} } } return num>1? ret*(num-1):ret;}__int64 power(__int64 num,__int64 k,__int64 mod){ if(num==0) { if(k!=0) return 0; else return 1; } __int64 res=1; while(k) { if(k&1) { res=res*num%mod; if(res==0) res=mod; } num= (num%mod) * (num%mod) % mod; k>>=1; } return res;}void init(int mm,int l){ m[1]=mm; for(int i=2;i<=l+1;i++) m[i]=eular(m[i-1]);}int main(){ int tt,mo; scanf("%d",&tt); while(tt--) { scanf("%s%d",&n,&mo); int l=strlen(n); init(mo,l); __int64 ans=1; for(int i=0;i<l;i++) { if(ans!=0) { ans%=m[l-i]; if(ans==0) ans=m[l-i]; } ans=power(n[i]-'0',ans,m[l-i]); } printf("%I64d\n",ans); memset(n,0,sizeof(0)); } return 0;}
- HDU 2837 Calculation (指数循环节)
- hdu 2837 Calculation 指数循环节
- HDU 2837 Calculation(指数循环节)
- hdu 2837 Calculation(指数循环节)
- HDU 2837 Calculation(指数循环节)
- HDU2837 Calculation【指数循环节】
- hdu 2837 Calculation【欧拉函数,快速幂求指数循环节】
- HDU2837 Calculation 指数循环节 欧拉函数+快速幂
- hdu 3221 (指数循环节)
- hdu -2837(指数循环节+欧拉函数)
- 指数循环节 处理A^B 问题 Super A^B mod C + Calculation
- hdu 4704 Sum 指数循环节
- HDU 3609 (指数循环)
- HDU 2837 Calculation
- hdu 2837 Calculation
- HDU 2837 calculation
- hdu 2837 Calculation
- hdu 2837 Calculation 数论
- 史上最著名的10个思想实验
- Extjs学习总结之13面板panel
- 关于resources.ap_ does not exist的解决方法
- java调用Oracle存储过程
- hibernate的get方法
- HDU 2837 Calculation (指数循环节)
- Linux服务器常用的几个管理命令
- Extjs学习总结之14窗体window
- sicily 1712
- yield生成器
- 交叉编译器的建立及uboot、linux内核、busybox的编译方法
- 08面向对象高级特性一
- AirCassette音乐应用:复古情愫与现代社交元素的完美融合
- pentaho源码分析