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

 
posted @ 2021-01-23 16:15  FantasticDoulbeFish  阅读(248)  评论(0编辑  收藏  举报