poj - 3641 题解

题意:检验一个数是否是质数,且满足ap = a (mod p)

题解:快速幂,质数检验

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<algorithm>
 4 #include<cmath>
 5 using namespace std;
 6 long long power(long long a,long long b,long long c)
 7 {
 8     long long res,t;
 9     res=1;
10     t=a%c;
11     while(b)
12     {
13         if(b&1)
14         {
15             res*=t;
16             res%=c;
17         }
18         t*=t;
19         t%=c;
20         b>>=1;
21     }
22     return res;
23 }
24 bool is_prime(int x)
25 {
26     bool res=true;
27     for(int i=2;i<=sqrt(x);i++)
28     {
29         if(x%i==0)
30         {
31             res=false;
32         }
33     }
34     return res;
35 }
36 int main()
37 {
38     long long p,a;
39     while(true)
40     {
41         cin>>p>>a;
42         if(p==0&&a==0)
43         {
44             break;
45         }
46         if(is_prime(p))
47         {
48             cout<<"no\n";
49             continue;
50         }
51         if(power(a,p,p)==a)
52         {
53             cout<<"yes\n";
54         }
55         else
56         {
57             cout<<"no\n";
58         }
59     }
60     return 0;
61 }
时间: 2024-08-24 02:37:47

poj - 3641 题解的相关文章

POJ 3641 Pseudoprime numbers 米勒罗宾算法

链接:http://poj.org/problem?id=3641 题意:由费马小定理可得,对于素数p,a^p = a (mod p),但是对于某些非素数p,也有比较小的可能满足a^p = a (mod p),如果满足,则称p是a条件下的伪素数,现给出p,a,问p是不是a条件的伪素数. 思路:首先用米勒 罗宾判断p是不是素数,如果不是,判断a^p = a (mod p)是否成立. 代码: #include <iostream> #include <cstdio> #include

poj 3641 ——2016——3——15

传送门:http://poj.org/problem?id=3461 题目大意:给你两个字符串p和s,求出p在s中出现的次数. 题解:这一眼看过去就知道是KMP,作为模板来写是最好不过了.... 这道题我写了两种风格的kmp,个人感觉第2种好理解一些; 1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4 #define inf 5 char s[1000100],p[100010]; 6 in

POJ 3641 Pseudoprime numbers(快速幂)

嗯... 题目链接:http://poj.org/problem?id=3641 AC代码: 1 #include<cstdio> 2 #include<iostream> 3 4 using namespace std; 5 6 inline bool is_prime(int x){ 7 if(x == 2) return 1; 8 if(x % 2 == 0) return 0; 9 for(int i = 3; i * i <= x; i += 2){ 10 if(!

poj 3641 Pseudoprime numbers Miller_Rabin测素裸题

题目链接 题意:题目定义了Carmichael Numbers 即 a^p % p = a.并且p不是素数.之后输入p,a问p是否为Carmichael Numbers? 坑点:先是各种RE,因为poj不能用srand()...之后各种WA..因为里面(a,p) ?= 1不一定互素,即这时Fermat定理的性质并不能直接用欧拉定理来判定..即 a^(p-1)%p = 1判断是错误的..作的 #include<iostream> #include<cstdio> #include&l

poj - 3070 题解

题意:斐波那契数列的矩阵链乘求法. 题解:快速幂优化矩阵链乘解决. 1 #include<iostream> 2 #include<algorithm> 3 #include<cstdio> 4 #include<cstring> 5 using namespace std; 6 struct datatype 7 { 8 int a[2][2]; 9 }; 10 datatype multiple(datatype x,datatype y) 11 { 1

poj 1066 题解

题意:求从正方体外面到达这个黑点所需穿过的最少线段数(规定只能从线段中点穿过,包括最外层的墙),共有n面墙 0 <= n <= 30 题解:事实上枚举边界上的中点,判断它和黑点的线段与这些墙的交点数即可 解释:注意到,墙这一长线段相对于黑点连线,等价于直线--无论是在实现上还是题意上.连线若与墙相交,则黑点与枚举点必在墙两侧,无可避免地要穿过这面墙,至于从线段中点穿过在本题中是没有意义的.起始点选取本该在线段中点,但显然选取两个端点的最小值不会比它差,而一个端点的结果不会比相邻的两个中点结果好

poj 1556 题解

题意:如图,大概猜的到了?最多18面墙,每面墙上两个门,从(0,5)走到(10,5)的最短距离,保留两位小数 题解:这道题非常贴心地按序给出墙的坐标,把每个端点当做图里面的一个节点,用O(n3)时间判断每两点之间是否能连边,判断方法为判断直线与线段是否相交(事实上是两个线段,但在这道题里面用直线交线段即可),跑一个最短路即可(既然已经到了三次方级别,干脆写了最短的Floyd) #include<cmath> #include<cstdio> #include<cstring&

poj - 1002题解

题意:给定一个字符串,按一定格式处理后排序并输出 题解:转换成7位数字来处理即可,输出的时候注意格式. 1 #include<iostream> 2 #include<algorithm> 3 #include<string> 4 using namespace std; 5 long a[100001]; 6 bool com(const int &x,const int&y) 7 { 8 return x<y; 9 } 10 int main(

poj 2826 题解

题意:给出两条线段的位置(可相交),用它们来接落下来的雨水,问最终储水量是多少 题解:基本思路是求出两条线段交点,然后计算在交点上方部分三角形(短板效应,大小由较小的y确定)的面积即可. 注意点:事实上这个问题是判定+计算,要判定能不能接到水,再进行计算. 判定①:线段不相交或平行,则接不到水 判定②:以交点为起点的两条向上的两条线段中,一条线段完全挡住了另一条线段,则接不到水 由于存在判定,所以会出现精度问题,要注意eps的使用 实现: ①每条线段被交点分成两部分,用(1,0)×线段,选取结果