问题 D: 2^x mod n = 1
时间限制: 1 Sec 内存限制: 32 MB提交: 17 解决: 8
[ 提交][ 状态][ 讨论版]
题目描述
给你一个正整数n,要求你找到最小的x(x>0)满足2^x mod n = 1。
输入
输入包含多组测试数据。每行一个正整数,代表n的值。
输出
如果最小的x存在,则输出2^x mod n = 1(注意x和n要用具体的值代替),否则输出2^? mod n = 1。
样例输入
2
5
样例输出
2^? mod 2 = 1
2^4 mod 5 = 1
提示
分析:先打表,然后用map设置对应关系,反向看有没有map里的元素存在就好了,注意的是数据范围和1的特殊性。(不过数据弱被我水过去了)
#include <bits/stdc++.h>
using namespace std;
int a[105];
map<long long,long long> mp;
int main()
{
int q;
set<int> st;
long long w=1;
for(int i=1;i<=20;i++)
{
w*=2;
mp[w]=i;
}
while(cin>>q)
{
if(q==1)
{
puts("2^? mod 1 = 1");
continue;
}
bool ok=1;
for(int i=1;i<=2000;i++)
{
if(mp[q*i+1])
{
printf("2^%lld mod %d = 1\n",mp[q*i+1],q);
ok=0;
break;
}
}
if(ok) printf("2^? mod %d = 1\n",q);
}
return 0;
}