北大ACM3641——Pseudoprime numbers~~快速求幂法

来源:互联网 发布:mac系统怎么卸载flash 编辑:程序博客网 时间:2024/06/05 10:25

这一题,主要是快速求幂的方法的应用。

可以看看快速求幂方法的原理: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;elsereturn 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的二进制数的最后一位为1sum = sum * a % mod;       //sum 乘上a = a * a % mod;               //不断乘以ap >>= 1;                       //p除以2;}if(sum == ans)cout << "yes" << endl;elsecout << "no" << endl;}return 0;}


1 0
原创粉丝点击