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。
由于结果特别大,一般题中会让结果对一个数取模,注意取模运算一定要在快速幂的过程中进行,不然结果会溢出导致错误。
大致题意就是给你两个数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"); } }
相关文章推荐
- C++快速幂与大数取模算法示例
- 初学ACM - 组合数学基础题目PKU 1833
- POJ ACM 1001
- POJ ACM 1002
- 1611:The Suspects
- POJ1089 区间合并
- POJ 2159 Ancient Cipher
- POJ 2635 The Embarrassed Cryptographe
- POJ 3292 Semi-prime H-numbers
- POJ 2773 HAPPY 2006
- POJ 3090 Visible Lattice Points
- POJ-2409-Let it Bead&&NYOJ-280-LK的项链
- POJ-1695-Magazine Delivery-dp
- POJ1523 SPF dfs
- POJ-1001 求高精度幂-大数乘法系列
- POJ-1003 Hangover
- POJ-1004 Financial Management
- poj 1753 Flip Game
- poj 1328 Radar Installation
- poj 2528 Y2K Accounting Bug