[TK] Terrible Prime
题目链接 T415418
这道题严格的时间限制比较令人头疼,似乎需要一些高级的算法,但实际上是,想要用点基础知识通过这道题需要两种算法:费马小定理 (见下函数Miller_rabin) 用于subtask1,另一种算法 (见下函数prim) 用于subtask2.两个subtask的范围限制给了我们这样一个机会.
关于费马小定理,参见 Oi-wiki .
string s[2]={"No","Yes"};
typedef long long ll;
ll m;
#define fo(x,y,z) for(int (x)=(y);(x)<=(z);(x)++)
#define fu(x,y,z) for(int (x)=(y);(x)>=(z);(x)--)
typedef pair<int,int> pii;
const int zhenli=0;
const int maxx=0x7f7f;
const int N=3000005;
int n;
ll a[N],ma=-1,b[N];
inline ll quick_mul(ll a,ll b,ll m) //快速乘
{
    ll ans = 0;
    a %= m;
    b %= m;
    while (b) {
        if (b & 1) {
            ans = (ans + a) % m;
        }
        a = (a + a) % m;
        b >>= 1;
    }
    return ans;
}
ll quick_pow(ll a,ll b,ll m) //快速幂
{
    ll res=1;
    a%=m;
    while(b)
    {
        if(b&1) res=quick_mul(res,a,m);
        a=quick_mul(a,a,m);
        b>>=1;
    }
    return res;
}
bool Miller_rabin(ll n,ll num)
{
    if(n==2||n==3) return true;
    if(n%2==0||n==1) return false;
    srand((unsigned)time(NULL)); //为接下来a的随机取值用
    ll d=n-1;
    int s=0;
    while(!(d&1)) s++,d>>=1;//若d的二进制的最后一位不是1,则说明d还是偶数
    for(int i=0;i<num;i++)
    {
        ll a=rand()%(n-2)+2;//2~n-1;
        ll x=quick_pow(a,d,n), y=0;
        for(int j=0;j<s;j++)//一共平方s次
        {
            y=quick_mul(x,x,n);//先平方
            if(y==1&&x!=1&&x!=(n-1)) return false;//验证二次探测原理
            x=y;
        }
        if(y!=1) return false;//不满足费马小定理,那就肯定不是质数
    }
    return true;
}
bool prim(ll num)
{
	if(num==1)return 0;
	if(num==2||num==3)return 1;
   	if(num%6!=1&&num%6!=5)return 0;
   	long long tmp=sqrt(num);
   	for(long long i=6;i<=tmp+1;i+=6){
    		if(num%(i-1)==0||num%(i+1)==0)return 0;
	}
   return 1;
}
int main(){
	ll n;
	cin>>n;
	if(n<=900){
		fo(i,1,n)
		{
			scanf("%lld",&a[i]);
			ma=max(ma,a[i]);
			b[i]=10;
		}
		fo(i,1,n)
		{
			if(Miller_rabin(a[i],b[i]))cout<<"Yes";
			else cout<<"No";
			if(i!=n)cout<<endl;
		}
		return 0;
	}
	for(int i=1;i<=n;i++){
		scanf("%lld",&m);
		cout<<s[prim(m)]<<endl;
	}
	return 0;
}
[TK] Terrible Prime的更多相关文章
- HZOJ 20190722 visit (组合数学+数论)
		考试T2,考试时打了个$O(n^3)$dp暴力,思路还是很好想的,但细节也不少,然后滚动数组没清空,而且题又看错了,只得了10pts,真是血的教训. 题解: 其实看数据范围,给出了模数是否为质数,其实 ... 
- Java 素数 prime numbers-LeetCode 204
		Description: Count the number of prime numbers less than a non-negative number, n click to show more ... 
- import matplolib 时出现"This probably means that tk wasn't installed properly."的解决方法
		最近又添了一台新电脑,配置好各个依赖环境后想用matplotlib画个图,结果报出下面的错误 根据报错分析,应该是C:/Python27/tcl/tk8.5/tk.tcl这个文件出问题了,根据图中的信 ... 
- Prime Generator
		Peter wants to generate some prime numbers for his cryptosystem. Help him! Your task is to generate ... 
- POJ 2739. Sum of Consecutive Prime Numbers
		Sum of Consecutive Prime Numbers Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 20050 ... 
- UVa 524  Prime Ring Problem(回溯法)
		传送门 Description A ring is composed of n (even number) circles as shown in diagram. Put natural numbe ... 
- Sicily 1444: Prime Path(BFS)
		题意为给出两个四位素数A.B,每次只能对A的某一位数字进行修改,使它成为另一个四位的素数,问最少经过多少操作,能使A变到B.可以直接进行BFS搜索 #include<bits/stdc++.h& ... 
- hdu 5901  count prime &  code vs 3223 素数密度
		hdu5901题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5901 code vs 3223题目链接:http://codevs.cn/problem ... 
- 最小生成树 prime zoj1586
		题意:在n个星球,每2个星球之间的联通需要依靠一个网络适配器,每个星球喜欢的网络适配器的价钱不同,先给你一个n,然后n个数,代表第i个星球喜爱的网络适配器的价钱,然后给出一个矩阵M[i][j]代表第i ... 
- 最小生成树 prime poj1258
		题意:给你一个矩阵M[i][j]表示i到j的距离 求最小生成树 思路:裸最小生成树 prime就可以了 最小生成树专题 AC代码: #include "iostream" #inc ... 
随机推荐
- C# 常用类和命名空间
			Array类 用括号声明数组是C#中使用Array类的记号.在后台使用C#语法,会创建一个派生于抽象基类Array的新类.这样,就可以使用Array类为每个C#数组定义的方法和属性了. Array类实 ... 
- Python 阿里云OSS文件上传下载与文件删除及检索示例
			阿里云OSS文件上传下载与文件删除及检索示例 实践环境 运行环境: Python 3.5.4 CentOS Linux release 7.4.1708 (Core)/Win10 需要安装以下类库: ... 
- vue项目使用elementUI的el-upload组件实现图片上传和文件上传的公共组件封装
			图片上传: <template> <div class="upload-pic"> <el-upload class="upload-dem ... 
- Centos7下安装配置最新版本Jenkins(2.452.3)
			1.基础环境配置 1.1 服务器下载Jenkins安装包 下载地址:https://www.jenkins.io/download/ 下载命令:wget https://get.jenkins.io/ ... 
- HDP 源码集
			HDP 各个组件的源码(含历史各个版本) 分支 组件 标签 最后发版时间 地址 hadoop 2256 2020-12-21 17:44 https://gitee.com/piaolingzxh/h ... 
- 【SpringBoot】08 探索配置方式 Part4 优先加载的路径
			配置文件的加载位置: SpringBoot启动会扫描i以下为位置的applicationproperties 或者application.yml文件,作为springboot的默认配置文件 优先级从高 ... 
- 【DataBase】MySQL 08 SQL函数 单行函数其二 数值函数
			数值函数 # 数值函数 -- ROUND() 四舍五入 SELECT ROUND(3.14),ROUND(-3.14); -- 重载,保留指定参数的小数位数 SELECT ROUND(-3.14,3) ... 
- 【转载】      tensorflow: 怎样找到对应的bazel 版本和安装
			版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/u011279649/article/de ... 
- centos 安装 图像识别工具 tesseract-ocr 流程
			(1)首先安装依赖的leptonica库:wget http://www.leptonica.com/source/leptonica-1.72.tar.gztar -xvf leptonica-1. ... 
- UITableView的原理——探究及重新实现代码
			转自简书,原文地址,本文主要探讨一些特殊细节,像视图重用这类最基本的原理可在源码里查看. 先前重新实现了一个list容器视图,由于Apple没有开源,在此分享过程中探索到的UITableView一些细 ... 
