博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
UVA 10692 Huge Mods(指数循环节)
阅读量:6456 次
发布时间:2019-06-23

本文共 1377 字,大约阅读时间需要 4 分钟。

指数循环节,由于a ^x = a ^(x % m + phi(m)) (mod m)仅在x >= phi(m)时成立,故应注意要判断

 

//by:Gavin http://www.cnblogs.com/IMGavin///指数循环节 递归处理#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;typedef long long LL;const int N = 10008, INF = 0x3F3F3F3F;LL a[N], mod, n;int phi[N];void allPhi(int n){ memset(phi,0,sizeof(phi)); phi[1]=1; for(int i=2;i<=n;i++){ if(!phi[i]){//则i为素数 phi[i]=i; for(int j=i;j<=n;j+=i){ if(!phi[j]){ phi[j]=j; } phi[j]=phi[j]/i*(i-1); } } }}LL PowMod(LL a,LL b,LL MOD){ LL ret=1; while(b){ if(b&1){ ret = ret * a % MOD; } a = a * a % MOD; b>>=1; } return ret;}bool check(LL a, LL n, LL m){ if(a == 1){ return false; } LL ans = 1; for(int i = 0; i < n; i++){ ans *= a; if(ans >= m){ return true; } } return false;}LL dfs(LL d, LL m, bool &sym){ if(d == n){ if(a[d] >= m){ sym = 1; }else{ sym = 0; } return a[d] % m; } bool flag; LL p = dfs(d + 1, phi[m], flag); if(flag){ p += phi[m]; } sym = check(a[d], p, m); return PowMod(a[d], p, m);}int main(){ allPhi(N - 2); int t = 0; while(cin >> mod){ cin >> n; for(int i = 1; i <= n; i++){ cin >> a[i]; } bool flag; printf("Case #%d: %lld\n", ++t, dfs(1, mod, flag) % mod); } return 0;}

  

转载于:https://www.cnblogs.com/IMGavin/p/6124018.html

你可能感兴趣的文章
IE8兼容@media和mp4视频的解决方案
查看>>
第二周总结
查看>>
概率图模型建模、学习、推理资料总结
查看>>
【转】知道这20个正则表达式,能让你少写1,000行代码
查看>>
自定义 启动和关闭 oracle 的命令
查看>>
Quartz
查看>>
正则表达式介绍
查看>>
初识Scala反射
查看>>
第三十九天
查看>>
Redis详解
查看>>
论程序员加班的害处
查看>>
codeblocks快捷键
查看>>
基于HTML5的WebGL设计汉诺塔3D游戏
查看>>
WPF资料链接
查看>>
过滤DataTable表中的重复数据
查看>>
prepare for travel 旅行准备
查看>>
再次更新
查看>>
微服务学习笔记二:Eureka服务注册发现
查看>>
C# 获取编码
查看>>
mysql的数据类型int、bigint、smallint 和 tinyint取值范围
查看>>