博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
hdu1395 数论 欧拉函数
阅读量:6970 次
发布时间:2019-06-27

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

hdu1395

数论   欧拉函数

对于给出的每一个n
求最小正整数 x 满足 2^x mod n = 1
1、如果给出的n 是偶数或者 1 则一定无解
2、如果是奇数 首先根据欧拉定理 我们可知 phi(n)一定是满足要求的
然后答案一定是 phi( i ) 的因数
然后我们就可以 O(sqrt(phi(i))的时间内 枚举每个因数 然后快速幂验证就行了

 

1 #include 
2 using namespace std ; 3 4 const double eps = 1e-8 ; 5 const int inf = 1e9 ; 6 int n,x,t,ans ; 7 8 inline int Phi(int n) 9 {10 int ans = n ; 11 for(int i=2,zz = int(sqrt(n)+eps);i<=zz;i++) 12 {13 if( n % i==0 ) 14 ans = ans - ans / i ; 15 while(n%i==0) n/=i ; 16 }17 if( n!=1 ) 18 ans = ans - ans/n ; 19 return ans ; 20 }21 22 inline int ksm(int base,int ind,int mod) 23 {24 int now = 0,b[32] ; 25 while(ind) 26 {27 b[++now] = ind&1 ; 28 ind = ind>>1 ; 29 } 30 int ans = 1 ; 31 for(int i=now;i>=1;i--) 32 {33 ans = ans * ans % mod ; 34 if(b[ i ]) ans = ans*base % mod ; 35 }36 return ans ; 37 }38 inline bool check(int x) { return ksm(2,x,n)==1 ; } 39 40 int main() 41 { 42 while(~scanf("%d",&n)) 43 {44 if(n%2==0||n==1) 45 {46 printf("2^? mod %d = 1\n",n) ; 47 continue ; 48 }49 t = Phi( n ) ; 50 ans = inf ; 51 for(int i=2,zz = int(sqrt(t)+eps);i<=zz;i++) 52 {53 if(t%i!=0) continue ; 54 if(check( i )) 55 {56 ans = i ; 57 break ; 58 }59 if(check( t/i )) 60 if( t/i

 

转载于:https://www.cnblogs.com/third2333/p/7182722.html

你可能感兴趣的文章
GCD编程 之 略微提高篇
查看>>
第十四章 数字签名算法--RSA
查看>>
Deep Learning for Nature Language Processing --- 第四讲(下)
查看>>
第一次打开Photoshop时的基本设置
查看>>
讲座:计算机专业及其学习
查看>>
CentOS 7 启动、重启、chkconfig等命令已经合并为systemctl
查看>>
POI 中的CellRangeAddress 参数
查看>>
Http Request
查看>>
Map集合中value()方法与keySet()、entrySet()区别 《转》
查看>>
Thrift反序列化导致OOM(转)
查看>>
自定义用户登录,会话保持,登录后自动跳转原页面
查看>>
Quartz的cronTrigger表达式
查看>>
李洪强经典iOS面试题11
查看>>
知乎上关于游戏引擎的讨论
查看>>
解决:error: Cannot fetch repo (TypeError: expected string or buffer)
查看>>
oracle 11g RAC 的一些基本概念(三)
查看>>
api数据接口
查看>>
买房的贷款时间是否是越长越好?https://www.zhihu.com/question/20842791
查看>>
maven整合S2SH
查看>>
Android 增量更新完全解析 是增量不是热修复
查看>>