[pandaking训练7]-----基础数论 c题 hdu2138 miller-robbin判断素数

就存个板子吧:具体想学算法的可以看其他博客。。。。。

 1 #include <bitset>
 2 #include <cstring>
 3 #include <algorithm>
 4 #include <iostream>
 5 #include <cstdio>
 6 #include <cmath>
 7 using namespace std;
 8 typedef long long LL;
 9 LL mul(LL a, LL b, LL p)
10 {
11     LL rn=0, i;
12     for(i=1; i<=b; i<<=1,a=(a+a)%p)
13         if(b&i) rn=(rn+a)%p;
14     return rn;
15 } // 计算模意义下两大数乘积
16 LL ksm(LL a, LL b, LL p)
17 {
18     LL rn=1;
19     for(; b; a=mul(a,a,p),b>>=1)
20         if(b&1) rn=mul(rn,a,p);
21     return rn;
22 } // 计算模意义下两大数乘方
23 LL gcd(LL a, LL b)
24 {
25     LL tmp; if(a<b) tmp=a,a=b,b=tmp;
26     while(b) tmp=a%b, a=b, b=tmp;
27     return a;
28 } // 求最大公约数
29 bool isprime(LL n)
30 {
31     if(n==2) return true;
32     //n==2的时候直接判断
33     if(n<2 || !(n&1)) return false;
34     //n为偶数或者n等于2为错误
35     LL a,x,y, u=n-1; int t=0;
36     while((u&1)==0) t++, u>>=1;
37     //将(p-1)拆成k*(2^j),先令x=(p-1)^k,对于2^j
38     //我们一边平方x,一边利用定理2判定
39     //最后用定理1检查一次
40     for(int i=0; i<10; i++)
41     {
42         a=rand()%(n-1)+1;
43         //随机一个数
44         x=ksm(a,u,n);
45         //将x乘以2倍,为什么要这样搞,是为了防止long long * long long 爆掉
46         for(int j=1; j<=t; j++)
47         {
48             y=mul(x,x,n);
49             //二次检测
50             if(y==1 && x!=1 && x!=n-1) return false;
51             //是否通过二次检测
52             x=y;
53         }
54         if(x!=1) return false;
55         // 最后再试一遍
56     }
57     return true;
58 }
59
60 int main(){
61     int n,ans=0;
62     LL x;
63     while(scanf("%d",&n)!=EOF) {
64         ans=0;
65         while (n--) {
66             scanf("%lld", &x);
67             if (isprime(x)) ans++;
68         }
69         printf("%d\n", ans);
70     }
71 }

原文地址:https://www.cnblogs.com/pandaking/p/11123844.html

时间: 2024-11-13 04:25:11

[pandaking训练7]-----基础数论 c题 hdu2138 miller-robbin判断素数的相关文章

基础数论30题

什么都不会的蒟蒻开始打基础了\(qwq\) CF1166E The LCMs Must be Large 考虑集合\(\{a,b,c\}\) 对于任意两次限制交集为空,则不可能 考虑两次限制分别为\(\{a\},\{c\}\),则\(lcm_a>lcm_{b,c},lcm_a>lcm_{a,c}\),又\(lcm_{b,c}≥lcm_b,lcm_{a,c}≥lcm_a\) 则\(lcm_a>lcm_{b,c}≥lcm_b>lcm_{a,c}≥lcm_a\),显然出现了矛盾 对于任意

数论基础题目八题【欧几里得】【筛法素数】【中国剩余定理】

之前看的数论的知识,现在做几道题目找找感觉..... poj 1061 传送门 题目大意,给你x,y,m,n,L.代表青蛙a的坐标x,青蛙b的坐标y,青蛙a一次跳的距离m,青蛙b一次跳的距离n,以及mod的值L,求经过多少次跳相遇.即求:(m-n)*x0=(x-y)(mod L);  模线性方程的解,不过要注意处理,因为(m-n)和(x-y)有可能是负的,如果(m-n)是负的,则直接对俩数取负数,下面就是对 ((x-y)+L)%L. 然后就能用modular_linear_equation(LL

HDU2481 Toy (数论好题)

该题果然是个好题啊! 题意来自上一题, ( http://blog.csdn.net/jayye1994/article/details/37814965 )  BZOJ 1002: [FJOI2007]轮状病毒 上一题是旋转后相同视为不同情况,这题旋转后相同视为同一种情况.就这么一个小小的区别, 上一题用到了dp,这一题用到了dp.筛素数.二进制模拟乘法.矩阵.快速幂.欧拉函数.burnside引理.. 同样是人(题)..做人(题)的差距怎么就这么大呢.. 数据范围:周围是n个点,答案取模m,

HDU-1576 A/B 基础数论+解题报告

HDU-1576 A/B 基础数论+解题报告 题意 求(A/B)%9973,但由于A很大,我们只给出n(n=A%9973) (我们给定的A必能被B整除,且gcd(B,9973) = 1). 输入 数据的第一行是一个T,表示有T组数据. 每组数据有两个数n(0 <= n < 9973)和B(1 <= B <= 10^9). 输出 对应每组数据输出(A/B)%9973. 解题思路 看到这里就能想到这个题是有关数论的了吧. 下面是对题目给的公式进行一些变形 设p=9973,令(C就是我们

数论 --- 简单题

吃糖果 Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total Submission(s): 22376    Accepted Submission(s): 6396 Problem Description HOHO, 终于从Speakless手上赢走了所有的糖果,是Gardon吃糖果时有个特殊的癖好,就是不喜欢将一样的糖果放在一起吃,喜欢先吃一种,下一次吃另一 种,这样:

BZOJ1968: [Ahoi2005]COMMON 约数研究(数论 水题)

Description Input 只有一行一个整数 N(0 < N < 1000000). Output 只有一行输出,为整数M,即f(1)到f(N)的累加和. Sample Input 3 Sample Output 5 Solve: 数论水题,求因数又不是质因数,所以,只要求出对于[1 , n]有多少个倍数,就表示[1 , n]中以i为因数的是哪些,加起来就可以了 Code: 1 #include <bits/stdc++.h> 2 using namespace std;

POJ 3358 Period of an Infinite Binary Expansion( 数论好题 + 欧拉定理 + 欧拉函数 )

POJ 3358 Period of an Infinite Binary Expansion( 数论好题 + 欧拉定理 + 欧拉函数 ) #include <cstdio> #include <cstring> #include <algorithm> #include <algorithm> using namespace std; typedef long long LL; LL fac[ 100000 ], pf; LL gcd( LL a, LL

Dream_Chaser队训练赛第一场 I题

Dream_Chaser队训练赛第一场 I题 题目来自2012成都区域赛 I - Count Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status Practice HDU 4472 Description Prof. Tigris is the head of an archaeological team who is currently in charge of a

数论十题

数论十题 Problem Zero:[neerc2011]Gcd guessing game 现在有一个数x,1 ≤ x≤ n,告诉你n,每次你可以猜一个数y,如果x==y则结束,否则返回gcd(x,y),问最少只要几次就可以保证猜出答案. 本题纯属娱乐.仅仅是一个GCD的游戏,跑题了. 因为本题要求最坏情况,我们直观地猜想就是每次返回都是1.由于答案有可能是质数,而判定一个数,必须要把含有这个质因子的数问一遍.于是,我们引出这样一个思路,将所有1-n的质数分组,每组的积<=n,答案就是组数.