您的位置:首页 > 其它

HDU 1395

2014-07-07 17:58 169 查看
惭愧啊!以前做过的题再做居然不会了。还是把题目想复杂了。

一般方法:

#include <stdio.h>
int main()
{
int n,s,temp;
while (~scanf("%d",&n))
{
if (n==1||n%2==0)
{
printf("2^? mod %d = 1\n",n);
}
else
{
s=1,temp=2;
while (temp!=1)
{
temp=temp*2%n;
s++;
}
printf("2^%d mod %d = 1\n",s,n);
}
}
return 0;
}

数论方法:
#include <iostream>
#include <cstring>
#include <string>
#include <cstdio>
#include <cmath>
using namespace std;
int Euler(int n)
{
int m=sqrt(n+0.5);
int ans=n;
for(int i=2;i<=m;++i)
{
if(n%i==0) ans=ans/i*(i-1);
while(n%i==0)
n/=i;
if(n==1)
break;
}
if(n>1)
ans=ans/n*(n-1);
return ans;
}
bool is_pow(int m,int n)
{
int ans=1,res=2;
while(m)
{
if(m&1)
ans=(ans*res)%n;
res=(res*res)%n;
m=m>>1;
}
return ans==1;
}
int main()
{
int n;
while(~scanf("%d",&n))
{
if((n&1)==0||n==1)
{
printf("2^? mod %d = 1\n",n);
}
else
{
int m=Euler(n),ans;
for(int i=2;;++i)
if(m%i==0&&is_pow(i,n))
{
ans=i;break;
}
printf("2^%d mod %d = 1\n",ans,n);
}
}
return 0;
}


补充:
费马小定理:假如p是质数,且(a,p)=1,那么 a^(p-1) ≡1(mod p)。即:假如a是整数,p是质数,且a,p互质,那么a的(p-1)次方除以p的余数恒等于1。

欧拉定理:若n,a为正整数,且n,a互质,(a,n) = 1,则a^φ(n) ≡ 1 (mod n)。

欧拉函数:少于或等于n的数中与n互质的数的数目。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: