这一题,主要是快速求幂的方法的应用。
可以看看快速求幂方法的原理:http://blog.csdn.net/qq_25425023/article/details/44316463
题目的大概意思是:
输入两个数p,a,p为素数,则直接输出no,否则判断a^p % p == a?等于就yes,不等于就no。
理解了题目的意思,就很容易了。
下面的是AC代码:
#include <iostream> #include <cstdio> using namespace std; int is_prime(__int64 x) //判断是否为素数 { int flag = 0; for(int i = 2; i * i <= x; i++) { if(x % i == 0) { flag = 1; break; } } if(flag) return 0; else return 1; } int main() { __int64 p, a; while(scanf("%I64d%I64d", &p, &a) != EOF) { if(p == 0 && a == 0) break; if(is_prime(p)) //判p是否为素数 { cout << "no" << endl; continue; } __int64 sum = 1; int mod = p; //备份p,后面p的值会改变 int ans = a; //备份a,后面a的值会改变 while(p > 0) { if(p & 1) //p的二进制数的最后一位为1 sum = sum * a % mod; //sum 乘上 a = a * a % mod; //不断乘以a p >>= 1; //p除以2; } if(sum == ans) cout << "yes" << endl; else cout << "no" << endl; } return 0; }
北大ACM3641——Pseudoprime numbers~~快速求幂法
原文地址:http://blog.csdn.net/qq_25425023/article/details/45487699