C语言编程练习22:2^x mod n = 1
题目描述
给你一个正整数n,要求你找到最小的x(x>0)满足2^x mod n = 1。
输入
输入包含多组测试数据。每行一个正整数,代表n的值。
输出
如果最小的x存在,则输出2^x mod n = 1(注意x和n要用具体的值代替),否则输出2^? mod n = 1。
样例输入 Copy
2
5
样例输出 Copy
2^? mod 2 = 1
2^4 mod 5 = 1
思路:这道题只要明白n取何值时没有相应的x就能AC
n=1无解。任何正数mod 1都为0
n为偶数无解,why? 上式可变形为: 2^x=k*n+1,若n为偶数那么k*n+1为奇数,而2^x必为偶数。
#include <stdio.h>
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
int x = 1;
if(n%2==0||n<=1)
{
printf("2^? mod %d = 1",n);
printf("\n");
continue;
}
while(x)
{
if(((int)pow(2,x)%n)==1)
{
printf("2^%d mod %d = 1",x,n);
printf("\n");
break;
}
x++;
}
}
return 0;
}
n为奇数一定有解,对于乘法逆元:在a mod n的操作下,a存在乘法逆元当且仅当a与n互质。

浙公网安备 33010602011771号