ZSYZZS(素数)

来源:互联网 发布:淘宝网红哪家店质量好 编辑:程序博客网 时间:2024/06/05 04:22

https://www.contesthunter.org/Contest/[orzzsy%E6%9D%AF]%E6%B0%B4%E9%A2%98%E7%AB%9E%E9%80%9F%E8%B5%9B/Problem/Show/ZSYZZS

题目给的数据大的吓人呀 ~

描述

给你两个整数a,b,请任意输出一个[a,b]内的质数

输入格式

两个用空格隔开的整数a和b(a<=b)

输出格式

一个整数,表示一个[a,b]内的质数,如果[a,b]内没有质数,请输出-1

样例输入

1 2

样例输出

2

数据范围与约定

  • 对于100%的数据:0&lt; a\leq b\leq 2^{50},为了简化题目,同时将保证|a-b|<=10000

看到这个数据,还以为如果b=2^50的时候会不会超时~~

错了几次,完了以后,ac时才发现,数据弱到爆~~

太假了,但是还是学到用概率法去求很大的素数。代码是看别人照着写的。到时候熟悉熟悉就行了。


简单的代码:


#include <iostream>#include <cmath>using namespace std;bool isprime(long long  n){   long long s=(long long)sqrt(n);   if(n==1) return false;      for(long long  i=2;i<=s;i++)    if(n%i==0)return false;    return true; }int main(){  long long a,b;    while(cin>>a>>b)  {    bool f(0);  for(long long i=a;i<=b;i++)   {    if(isprime(i)){     f=1;        cout<<i<<endl; break;      }      }          if(!f)cout<<-1<<endl;  }return 0;}

然后是,新学的算~~ 


#include<stdio.h>#include<stdlib.h>#include<time.h>#define maxTest 100#include <iostream>using namespace std;long long int Random(long long int n){    return (long long int)((double)rand()/RAND_MAX*n+0.5);}long long int Modular_Exp(long long int a, long long int b, long long int n) // a^b mod n{    long long int ans;    if(b == 0)        return 1;    if(b == 1)        return a % n;    ans = Modular_Exp(a, b/2, n);    ans = ans * ans % n;    if(b % 2)        ans = ans * a % n;    return ans;}bool Miller_Rabbin(long long int n)  //n是prime  {    for(int i=1; i<=maxTest; ++i)    {        long long int a = Random(n-2)+1;        if(Modular_Exp(a, n-1, n) != 1)            return false;    }    return true;}int main(){    long long int a;    long long int b;while(cin>>a>>b)    {     bool f(0);  srand(time(NULL));      for(long long int i=a;i<=b;i++)   //特别注意这里       if(i!=1&&Miller_Rabbin(i)){  f=1;              cout<<i<<endl;  break;}          if(!f) cout<<"-1"<<endl;}    return 0;}

这个算法要是忘记了的话可以看看网络收藏夹~~






原创粉丝点击