您的位置:首页 > 运维架构

Pseudoprime numbers(poj3641)快速幂

2016-09-27 20:39 387 查看
传送门:poj3641

大致题意就是给你两个数a和p,让你判断a是不是素数(素性判断)以及a的p次方模p是不是等于a,这里p的范围较大所以要用快速幂。

快速幂基本思想:将指数化为二进制,一开始定义一个变量x等于底数,从第一位开始二进制每前进一位就将x平方一次,二进制位若为一就将对应的x乘到结果当中去,假设a为底数,指数为5,即二进制101,a^5=1*a^1*1*a^4。

由于结果特别大,一般题中会让结果对一个数取模,注意取模运算一定要在快速幂的过程中进行,不然结果会溢出导致错误。

#include<stdio.h>
int isprime(long long n)//素性判断
{
if(n==2)
return 1;
for(int i=2;i*i<=n;i++)
if(n%i==0)
return 0;
return 1;
}
int main()
{
long long p,a;
while(scanf("%lld %lld",&p,&a)&&p&&a)
{
long long t=a;
long long ans=1;
if(isprime(p))
{
printf("no\n");
continue;
}
int b=p;
while(b)//快速幂
{
if(b%2)
{
ans*=t;
ans%=p;
}
t*=t;
t%=p;
b/=2;
}
if(ans==a)
printf("yes\n");
else
printf("no\n");
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息