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互质。