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过。
60 1
|
9月前
Pseudoprime numbers(POJ-3641 快速幂)
Pseudoprime numbers(POJ-3641 快速幂)
poj 1990 MooFest 树状数组
题意就是有N头牛,每头牛都有一个坐标和声调值(x, v),两头牛之间通讯要花费的能量是他们的距离乘以最大的一个音调值,现在要任意两头牛之间都相互通讯一次,求总共需要花费多少能量?
58 0
|
人工智能 网络架构
poj2793 素数和
题目链接:http://poj.org/problem?id=2739   #include using namespace std; int count=0; int prim[1234]={2,3}; void primer() { ...
751 0
poj1287 kruskal
http://poj.org/problem?id=1287 #include&lt;cstdio&gt; #include&lt;cstdlib&gt; #include&lt;iostream&gt; #define N 60 using namespace std; struct node { int x,y; int len; } city[26
883 0