题目链接:

http://acm.hdu.edu.cn/showproblem.php?pid=1395

题目大意:

题目中给出输入一个整数n,要求一个最小整数的x,使得2^x mod n=1;

解题思路:

2^x = 1(mod n)就是求2模上n的阶。

传送门:阶与原根

如果n是偶数或者是1,答案一定不存在

如果是偶数,2^x也是偶数,偶数模上偶数不可能为1。

如果n为1,那么模的结果一定为0。

如果n是奇数,那么可以求阶,也可以暴力(数据水)

求阶的方法:

 #include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int a[];
int euler_phi(int n)//求单个
{
int m = (int)sqrt(n + 0.5);
int ans = n;
for(int i = ; i <= m; i++)if(n % i == )
{
ans = ans / i * (i - );
while(n % i == )n /= i;
}
if(n > )ans = ans / n * (n - );
return ans;
}
ll pow(ll a, ll b, ll m)
{
a %= m;
ll ans = ;
while(b)
{
if(b & )ans = ans * a % m;
a = a * a % m;
b /= ;
}
return ans % m;
}
int main()
{
int n;
while(cin >> n)
{
int tot = ;
if(n % == || n == )
{
printf("2^? mod %d = 1\n", n);
continue;
}
int t = euler_phi(n);
//cout<<t<<endl;
for(int i = ; i * i <= t; i++)
{
if(t % i == )
{
a[tot++] = i;
if(i * i != t)a[tot++] = t / i;
}
}
sort(a, a + tot);
//for(int i = 0; i < tot; i++)printf("%d ", a[i]);
for(int i = ; i < tot; i++)
{
if(pow(, a[i], n) == )
{
printf("2^%d mod %d = 1\n", a[i], n);
break;
}
}
}
return ;
}

最新文章

  1. JS-时间函数
  2. [聊天框]让DIV的滚动条自动滚动到最底部 - 4种方法
  3. 编译工程时报illegal character:\65279--转
  4. Visual Studio下Qt调用IDL
  5. 【转】cocos2d-x 3x Sprite3D
  6. 标准C++中string类的用法
  7. java_reflect_03
  8. Android OpenGL库加载过程源码分析
  9. FZU Problem 2213 Common Tangents
  10. ios录音Demo
  11. Express4.x API (一):application (译)
  12. iOS开发之HTTP与HTTPS网络请求
  13. PHP和Redis实现在高并发下的抢购及秒杀功能示例详解
  14. safari 收藏导出 手机safari 导出
  15. html学习_认识html
  16. C++STL set
  17. js实现时间日期的格式化
  18. Linux 磁盘自动挂载
  19. LeetCode: Search in Rotated Sorted Array II 解题报告
  20. python-day33--互斥锁

热门文章

  1. ckeditor添加代码插入功能及高亮显示(插件)
  2. HTML页面中嵌入SVG
  3. vue2.0的虚拟DOM渲染
  4. [转]微信小程序联盟 跳坑《一百八十一》设置API:wx.openSetting使用说明
  5. JS实现单链表、单循环链表
  6. 使用在线工具下载YouTube视频
  7. python打开文件常见错误及解决办法
  8. express实现todolist
  9. Codeforces183D T-shirt
  10. Jupyter 常用快捷键 及 常用方法笔记