POJ 3641 Pseudoprime numbers
2016-07-23 11:23
579 查看
Pseudoprime numbers
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(a>1)有如下性质:a的p次方除以p的余数等于a。
有一些同样具有这个性质的非素数p被称为基数a的伪素数。(所有符合条件的a都被称为卡迈克尔数)
现在给定两个数p和a,问p是否是a的伪素数。是的话输出“yes”,反之输出“no”
题解:先用快速幂判定任意的p是否符合费马定理,然后再判断p是不是素数~
大概后台给的数据比较少,我直接暴力判定素数也没TLE……最好还是打个表吧=。=(感觉我这个代码很容易被hack啊)
#include<stdio.h> #include<string.h> #include<math.h> __int64 qp(__int64 a,__int64 p) { __int64 ans=1; __int64 mod=p; while(p) { if(p&1) ans=ans*a%mod; a=a*a%mod; p>>=1; } return ans; } int main() { __int64 p,a,i; while(scanf("%I64d%I64d",&p,&a),a||p) { int flag=0; __int64 temp=qp(a,p); if(temp==a) { for(i=2;i<sqrt(p);i++) { if(p%i==0) { flag=1; break; } } if(flag) printf("yes\n"); else printf("no\n"); } else printf("no\n"); } return 0; }
相关文章推荐
- linux笔记:文件系统管理-分区、文件系统以及文件系统常用命令
- 海岩之心 门户网站
- Unix环境高级编程 centos中配置apue编译环境
- Linux下用speedtest-cli测网速
- linux基础1
- 从initramfs根文件系统启动Linux
- windows下搭建hadoop开发环境
- linux中fork()函数详解(转)
- 从ramdisk根文件系统启动Linux
- centos7.0 没有netstat 和 ifconfig命令问题
- linux查找大文件
- Mac下的Bash配置文件冲突问题
- Linux vim注释颜色看不清如何更改?
- openjudge 2757:最长上升子序列
- linux中的内部命令和外部命令
- 海量数据中找出前k大数(topk问题)
- 搭建简单的Web服务器
- linux的x window system
- 亿级Web系统搭建——单机到分布式集群
- 使用ContentProviderOperation 来提升应用性能