POJ:3641 Pseudoprime numbers(快速幂)
2016-07-23 12:17
441 查看
Pseudoprime numbers
Description
Fermat's theorem states that for any prime number p and for any integer a > 1, ap = a (mod p). That is, if we raise a to the pth power and divide by p, the remainder
is a. Some (but not very many) non-prime values of p, known as base-a pseudoprimes, have this property for some a. (And some, known as Carmichael Numbers, are base-a pseudoprimes for all a.)
Given 2 < p ≤ 1000000000 and 1 < a < p, determine whether or not p is a base-a pseudoprime.
Input
Input contains several test cases followed by a line containing "0 0". Each test case consists of a line containing p and a.
Output
For each test case, output "yes" if p is a base-a pseudoprime; otherwise output "no".
Sample Input
Sample Output
Source
Waterloo Local Contest, 2007.9.23
题目大意:给你一个p,一个a,问是否满足ap = a (mod p),即a^p%p是否等于a,如果p不是素数但是满足这个条件,那么它是伪素数,输出yes。
解题思路:先判断p是否为素数,是的话直接输出no,如果不是素数的话,再判断它是否满足上面的式子,满足的话输出yes,不满足的话输出no。(这里不用筛素法,数组太大,直接判断p是不是素数)
代码如下:
#include <stdio.h>
#include <math.h>
__int64 quickpow(__int64 a,__int64 ci)
{
__int64 ans=1;
__int64 base=a;
__int64 mod=ci;
while(ci)
{
if(ci&1)
{
ans=(ans*base)%mod;
}
ci>>=1;
base=(base*base)%mod;
}
return ans;
}
int judge(__int64 p)
{
__int64 size=sqrt(p)+1;
for(__int64 i=2;i<=size;i++)
{
if(p%i==0)
return 0;
}
return 1;
}
int main()
{
__int64 p,aa;
while(scanf("%I64d%I64d",&p,&aa)!=EOF)
{
if(p==0&&aa==0)
break;
if(judge(p)==1)
{
printf("no\n");
continue;
}
__int64 ans=quickpow(aa,p);
if(ans==aa)
{
printf("yes\n");
}
else
{
printf("no\n");
}
}
return 0;
}
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 8579 | Accepted: 3604 |
Fermat's theorem states that for any prime number p and for any integer a > 1, ap = a (mod p). That is, if we raise a to the pth power and divide by p, the remainder
is a. Some (but not very many) non-prime values of p, known as base-a pseudoprimes, have this property for some a. (And some, known as Carmichael Numbers, are base-a pseudoprimes for all a.)
Given 2 < p ≤ 1000000000 and 1 < a < p, determine whether or not p is a base-a pseudoprime.
Input
Input contains several test cases followed by a line containing "0 0". Each test case consists of a line containing p and a.
Output
For each test case, output "yes" if p is a base-a pseudoprime; otherwise output "no".
Sample Input
3 2 10 3 341 2 341 3 1105 2 1105 3 0 0
Sample Output
no no yes no yes yes
Source
Waterloo Local Contest, 2007.9.23
题目大意:给你一个p,一个a,问是否满足ap = a (mod p),即a^p%p是否等于a,如果p不是素数但是满足这个条件,那么它是伪素数,输出yes。
解题思路:先判断p是否为素数,是的话直接输出no,如果不是素数的话,再判断它是否满足上面的式子,满足的话输出yes,不满足的话输出no。(这里不用筛素法,数组太大,直接判断p是不是素数)
代码如下:
#include <stdio.h>
#include <math.h>
__int64 quickpow(__int64 a,__int64 ci)
{
__int64 ans=1;
__int64 base=a;
__int64 mod=ci;
while(ci)
{
if(ci&1)
{
ans=(ans*base)%mod;
}
ci>>=1;
base=(base*base)%mod;
}
return ans;
}
int judge(__int64 p)
{
__int64 size=sqrt(p)+1;
for(__int64 i=2;i<=size;i++)
{
if(p%i==0)
return 0;
}
return 1;
}
int main()
{
__int64 p,aa;
while(scanf("%I64d%I64d",&p,&aa)!=EOF)
{
if(p==0&&aa==0)
break;
if(judge(p)==1)
{
printf("no\n");
continue;
}
__int64 ans=quickpow(aa,p);
if(ans==aa)
{
printf("yes\n");
}
else
{
printf("no\n");
}
}
return 0;
}
相关文章推荐
- zoj3549 快速幂
- 快速幂。素数筛选。辗转相除。
- Codevs 1250、1732 矩阵 快速幂
- PKU Campus 2016 H: Magical Balls
- 快速幂
- 蓝桥练习系统 历届试题 公式求值
- HDU 4990 (找规律 矩阵快速幂)
- Topcoder SRM661 ColorfulLineGraphs
- 矩阵快速幂求斐波那契通项(矩阵乘法优化线性递推式)
- poj3744 Scout YYF I
- 快速幂 小明系列故事——师兄帮帮忙
- 【学习笔记】快速幂
- [HDU4602]Partition
- hdu 5318 2015多校对抗赛三
- hdu - 4602 《Partition》
- 快速幂
- 递推数列
- 数值的整数次方
- Quick_Power快速幂
- HDU 5446 Unknown Treasure