Pseudoprime numbers POJ 3641(快速幂)

原题

题目链接

题目分析

依题意要先检测p是否为素数,这个可以用埃筛筛出1-sqrt(1e9)的素数,然后判定一下p是否能被这些数整除,不能的话就是素数,否则则为合数.至于a的p次方直接套个快速幂就行了.

代码

 1 #include <cstdio>
 2 #include <cstdlib>
 3 #include <iostream>
 4 #include <algorithm>
 5 #include <utility>
 6 #include <ctime>
 7 #include <cmath>
 8 #include <cstring>
 9 #include <string>
10 #include <stack>
11 #include <queue>
12 #include <vector>
13 #include <set>
14 #include <map>
15
16 using namespace std;
17 typedef long long LL;
18 const int INF_INT=0x3f3f3f3f;
19 const LL INF_LL=0x3f3f3f3f3f3f3f3f;
20
21 const int MAX=40000;
22 bool is_prime[MAX];
23 int prime[MAX];
24 int cnt;
25
26 void pre()
27 {
28     for(int i=2;i<MAX;i++) is_prime[i]=true;
29     for(int i=2;i<MAX;i++)
30     {
31         if(is_prime[i])
32         {
33             prime[cnt++]=i;
34             for(int j=(i<<1);j<MAX;j+=i) is_prime[j]=false;
35         }
36     }
37 }
38
39 LL q_power(LL a,LL b,LL mod)
40 {
41     LL res=1;
42     a%=mod;
43     while(b)
44     {
45         if(b&1) res=(res*a)%mod;
46         a=(a*a)%mod;
47         b>>=1;
48     }
49     return res;
50 }
51
52 bool check(LL x)
53 {
54     if(x<MAX) return is_prime[x];
55     for(int i=0;i<cnt;i++)
56         if(!(x%prime[i])) return false;
57     return true;
58 }
59
60 int main()
61 {
62 //    freopen("black.in","r",stdin);
63 //    freopen("black.out","w",stdout);
64     pre();
65     LL a,p;
66     while(~scanf("%lld %lld",&p,&a)&&(a||p))
67     {
68         if(q_power(a,p,p)==a&&!check(p)) printf("yes\n");
69         else printf("no\n");
70     }
71     return 0;
72 }

原文地址:https://www.cnblogs.com/VBEL/p/11444655.html

时间: 2024-07-30 11:34:54

Pseudoprime numbers POJ 3641(快速幂)的相关文章

Pseudoprime numbers POJ - 3641

快速幂入门... wa一次是因为没认识到p不能为质数 /*   author:hdsdogge   begin:   end:   cost:   */ #include<iostream> #include<string> #include<queue> #include<map> #include<stack> #include<algorithm> #include<cmath> #include<cstdio

Raising Modulo Numbers POJ 1995(快速幂模板)

原题 题目链接 题目分析 快速幂模板题,依题意套个求模快速幂,然后答案边加边模即可. 代码 1 #include <cstdio> 2 #include <cstdlib> 3 #include <iostream> 4 #include <algorithm> 5 #include <utility> 6 #include <ctime> 7 #include <cmath> 8 #include <cstring

UVA 11582 Colossal Fibonacci Numbers!(打表+快速幂)

Colossal Fibonacci Numbers! The i'th Fibonacci number f (i) is recursively defined in the following way: f (0) = 0 and f (1) = 1 f (i+2) = f (i+1) + f (i)  for every i ≥ 0 Your task is to compute some values of this sequence. Input begins with an int

Raising Modulo Numbers(POJ 1995 快速幂)

Raising Modulo Numbers Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 5934   Accepted: 3461 Description People are different. Some secretly read magazines full of interesting girls' pictures, others create an A-bomb in their cellar, oth

Raising Modulo Numbers 取模+快速幂

Raising Modulo Numbers 题目地址:http://poj.org/problem?id=1995 Description People are different. Some secretly read magazines full of interesting girls' pictures, others create an A-bomb in their cellar, others like using Windows, and some like difficult

POJ 1845-Sumdiv(快速幂取模+整数唯一分解定理+约数和公式+同余模公式)

Sumdiv Time Limit:1000MS     Memory Limit:30000KB     64bit IO Format:%I64d & %I64u Submit Status Practice POJ 1845 Appoint description:  System Crawler  (2015-05-27) Description Consider two natural numbers A and B. Let S be the sum of all natural d

POJ1995 Raising Modulo Numbers【整数快速幂】

题目链接: http://poj.org/problem?id=1995 题目大意: N个人在一起玩游戏,每个人默写两个数字Ai.Bi,在同一个时间公开给其他玩家看.游戏的目的是 为了看谁能够在最快的时间求出所有的Ai^Bi的和对M取模的值.那么问题来了:你能够快速算出 (A1B1+A2B2+ ... +AHBH)mod M 的值吗? 思路: 用二分整数快速幂算法计算出每一个Ai^Bi,然后依次相加取模. AC代码: #include<iostream> #include<algorit

poj 1995 快速幂(裸)

Raising Modulo Numbers Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 9218   Accepted: 5611 Description People are different. Some secretly read magazines full of interesting girls' pictures, others create an A-bomb in their cellar, oth

倍增法&amp;快速幂思想在解题中的应用

1.(a^b)mod p POJ 1995 快速幂板子题 (附带板子) typedef long long ll; ll mod; ll qp(ll a,ll b) { ll ret=1,base=a; while(b) { if(b&1) ret=(ret*base)%mod; base=(base*base)%mod; b=b>>1; } return ret; } 2.求(a*b)mod p; (a,b为longlong 64位整数乘法) 设b的二进制表示为b=Ck*2^k+Ck