HDU_1395 2^x mod n = 1

2^x mod n = 1

2014-7-31  12:07
/*
此题的精髓在于欧拉定理的运用。欧拉定理是这样的:已知 n,a为正整数,若gcd(a,n)=1  (也就是互质),那么(a^f(n))%n=1   . 
欧拉定理又是费马小定理的推广,费马小定理是这样的:已知 n,a为正整数,若gcd(a,n)=1  (也就是互质),那么(a^(n-1))%n=1
 
再看此题:首先 x>0,所以2^x必定为偶数,也就转化为一个偶数%n=1,若n也为偶数,则此式子是不可能余1的,并且! n=1的时候,任何数均余0。所以if语句就很轻易得能写出来了。   再说n为奇数时,很明显,奇数和2互质,那么运用欧拉定理,必定存在一个f(n)使余数为1,下面要做的就是找出这个最小的f(n)就好。
*/
 
 
Problem Description
Give a number n, find the minimum x(x>0) that satisfies 2^x mod n = 1.
 


 

Input
One positive integer on each line, the value of n.
 


 

Output
If the minimum x exists, print a line with 2^x mod n = 1.

Print 2^? mod n = 1 otherwise.

You should replace x and n with specific numbers.
 


 

Sample Input
  
  
2 5
 


 

Sample Output
  
  
2^? mod 2 = 1 2^4 mod 5 = 1
 


 

 
/* (此程序和下面的程序耗时相同)
#include<stdio.h>
int main()
{
    int n,x,m;
    while(~scanf("%d",&n)) 
    {
       if(n==1||n%2==0) { printf("2^? mod %d = 1\n",n); continue;} 
       else 
       {
            m=1;
            for(x=1;;x++)
            {
               m=m*2;
               if(m%n==1)   break;
               m=m%n;
               
            }
            printf("2^%d mod %d = 1\n",x,n);
       }
    }
    return 0;
}
*/



#include<stdio.h>
int main()
{
    int n;
    int x;
    int step;
    while(scanf("%d",&n)!=EOF)
    {
        x=1;
        step=2;
        if(n%2==0||n==1)
            printf("2^? mod %d = 1\n",n);
        else
        {
            
            while(step!=1)   //直接从x=2开始,因为不可能有结果是x=1 
            {
                step=step*2%n;
                x++;
            }
            printf("2^%d mod %d = 1\n",x,n);
        }
    }
    return 0;
} 
       


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值