POJ-3641,Pseudoprime numbers(快速幂)

简介: POJ-3641,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:


3 2


10 3


341 2


341 3


1105 2


1105 3


0 0


Sample Output:


no


no


yes


no


yes


yes


解题思路:  



这个题要求求出若p不是素数并且p^a是否等于a,若等于则输出yes,否则输出no。

这个题主要用到快速幂,其他就比较简单了,注意类型一定要是long long!!!(因为结果非常大)


程序代码:

 


#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
long long prime(long long x)
{
  for(int i=2;i<=sqrt(x);i++)
    if(x%i==0)
      return 0;
  return 1;
}
long long quickmul(long long a,long long b)
{
  long long ans=1;
  long long m=b;
  while(m)
  {
    if(m&1)//等价于m%2==1 
      ans=(ans*a)%b;
    a=(a*a)%b;
    m>>=1;//等价于m=m/2 
  }
  return ans;
}
int main()
{
  long long p,a;
  while(scanf("%lld %lld",&p,&a)&&(p+a))
  {
    if(prime(p))
      printf("no\n");
    else if(quickmul(a,p)==a)
      printf("yes\n");
    else
      printf("no\n");
  }
  return 0;
}



相关文章
|
Java C++
poj 1503 高精度加法
把输入的数加起来,输入0表示结束。 先看我Java代码,用BigINteger类很多东西都不需要考虑,比如前导0什么的,很方便。不过java效率低点,平均用时600ms,C/C++可以0ms过。
49 1
|
7月前
Pseudoprime numbers(POJ-3641 快速幂)
Pseudoprime numbers(POJ-3641 快速幂)
poj 1990 MooFest 树状数组
题意就是有N头牛,每头牛都有一个坐标和声调值(x, v),两头牛之间通讯要花费的能量是他们的距离乘以最大的一个音调值,现在要任意两头牛之间都相互通讯一次,求总共需要花费多少能量?
52 0
|
人工智能 网络架构
poj-1012-约瑟夫问题
Description The Joseph's problem is notoriously known. For those who are not familiar with the original problem: from among n people, numbered 1, 2, .
812 0
poj 1251 kruskal
http://poj.org/problem?id=1251 #include&lt;algorithm&gt; #include&lt;iostream&gt; #include&lt;cstdlib&gt; #include&lt;cstdio&gt; #include&lt;cmath&gt; using namespace std; #define maxm 205
1177 0
|
人工智能 机器学习/深度学习
poj2031 kruskal
http://poj.org/problem?id=2031 #include&lt;iostream&gt; #include&lt;algorithm&gt; #include&lt;cmath&gt; #include&lt;cstdio&gt; using namespace std; double a[101][4]; double esp = 0.0000001;
1060 0