UVA-10692 Huge Mods
2015-08-06 14:25
155 查看
题目大意:计算a1^a2^a3^a4......^an模m的值。
题目解析:幂取模运算的结果一定有周期。一旦找到周期就可把高次幂转化为低次幂。有降幂公式
(a^x)%m=(a^(x%phi(m)+phi(m))%m x>=phi(m)
其中,phi()函数是欧拉函数。
代码(代码有瑕疵)如下:
题目解析:幂取模运算的结果一定有周期。一旦找到周期就可把高次幂转化为低次幂。有降幂公式
(a^x)%m=(a^(x%phi(m)+phi(m))%m x>=phi(m)
其中,phi()函数是欧拉函数。
代码(代码有瑕疵)如下:
# include<iostream> # include<cstdio> # include<cstring> # include<algorithm> using namespace std; # define ll long long int num[12],n; char start[8]; int phi(int x) { int m=x; int ans=x; for(int i=2;i*i<=x;++i){ if(m%i==0){ ans=ans/i*(i-1); while(m%i==0) m/=i; } } if(m>1) ans=ans/m*(m-1); return ans; } int mypow(int a,int b,int m) { int res=1; while(b){ if(b&1) res=res*a%m; b>>=1; a=a*a%m; } return res; } int work(int i,int m) { if(i==n-1) return num[i]%m; int tm=phi(m); int nm=work(i+1,tm)+tm; return mypow(num[i],nm,m); } int main() { int cas=0; while(scanf("%s",start)&&start[0]!='#') { int mod=0; for(int i=0;i<strlen(start);++i) mod=mod*10+start[i]-'0'; scanf("%d",&n); for(int i=0;i<n;++i) scanf("%d",&num[i]); printf("Case #%d: %d\n", ++cas, work(0, mod)); } return 0; }
相关文章推荐
- Nginx Lua
- 获取当月天数
- Winserver2008R2 .netframework4.5 asp.netmvc 访问出现的是文件列表。
- C#委托
- 动态规划_DAG模型
- Android中Adapter之BaseAdapter使用
- hashlib
- SQl 注入及jsp+servlet中的应对方法
- 斯坦福《机器学习》Lesson8感想-------1、SMO
- HTML事件冒泡和JQuery阻止事件冒泡的方式
- 来电接听InCallScreen界面源码分析
- php中mail函数使用
- Boa constructor简介
- 初识MVC模式
- oracle (+)是什么意思
- [C#] 调试silverlight的时候,总是报“向占位程序传送了空的索引指针”
- Xcode 调试(转载)
- CSS定位
- windows下编译FreeSwitch
- Catch That Cow