zoukankan      html  css  js  c++  java
  • 【POJ1811】Prime Test

    【题目大意】

    若n是素数,输出“Prime”,否则输出n的最小素因子,(n<=2^54)

    【题解】

    和bzoj3667差不多,知识这道题没那么坑。

    直接上Pollord_Rho和Rabin_Miller就行了。

     1 /*************
     2   POJ 1811
     3   by chty
     4   2016.11.7
     5 *************/
     6 #include<iostream>
     7 #include<cstdio>
     8 #include<cstdlib>
     9 #include<cstring>
    10 #include<ctime>
    11 #include<cmath>
    12 #include<algorithm>
    13 using namespace std;
    14 typedef long long ll;
    15 const ll INF=1000000000000000000LL;
    16 const ll prime[10]={2,3,5,7,11,13,17,19,23};
    17 ll T,minn;
    18 inline ll read()
    19 {
    20     ll x=0,f=1;  char ch=getchar();
    21     while(!isdigit(ch))  {if(ch=='-')  f=-1;  ch=getchar();}
    22     while(isdigit(ch))  {x=x*10+ch-'0';  ch=getchar();}
    23     return x*f;
    24 }
    25 ll gcd(ll a,ll b) {return !b?a:gcd(b,a%b);}
    26 ll mul(ll x,ll y,ll mod) {return ((x*y-(ll)(((long double)x*y+0.5)/mod)*mod)%mod+mod)%mod;}
    27 ll fast(ll a,ll b,ll mod) {ll sum=1;for(;b;b>>=1,a=mul(a,a,mod))if(b&1)sum=mul(sum,a,mod);return sum;}
    28 bool Rabin_Miller(ll p,ll a)
    29 {
    30     if(p==2)  return 1;
    31     if(!(p&1)||p==1)  return 0;
    32     ll d=p-1;
    33     while(!(d&1))  d>>=1;
    34     ll m=fast(a,d,p);
    35     if(m==1)  return 1;
    36     for(;d<p;d<<=1,m=mul(m,m,p)) if(m==p-1)  return 1;
    37     return 0;
    38 }
    39 bool isprime(ll x)
    40 {
    41     for(ll i=0;i<9;i++)
    42     {
    43         if(prime[i]==x)  return 1;
    44         if(!Rabin_Miller(x,prime[i]))  return 0;
    45     }
    46     return 1;
    47 }
    48 void Pollord_Rho(ll x)
    49 {
    50     if(isprime(x))  {minn=min(minn,x);  return;}
    51     ll c=3;
    52     while(1)
    53     {
    54         ll x1(1),x2(1),i(1),k(2);
    55         while(1)
    56         {
    57             x1=(mul(x1,x1,x)+c)%x;
    58             ll d=gcd(x1>x2?x1-x2:x2-x1,x);
    59             if(d>1&&d<x)  
    60             {
    61                 Pollord_Rho(d);
    62                 Pollord_Rho(x/d);
    63                 return;
    64             }
    65             if(x1==x2)  break;
    66             if(++i==k)  x2=x1,k<<=1;
    67         }
    68         c++;
    69     }
    70 }
    71 void solve(ll x)
    72 {
    73     if(isprime(x))  {puts("Prime"); return;}
    74     minn=INF;
    75     Pollord_Rho(x);
    76     printf("%lld
    ",minn);
    77 }
    78 int main()
    79 {
    80     freopen("cin.in","r",stdin);
    81     freopen("cout.out","w",stdout);
    82     T=read();
    83     while(T--){ll x=read();solve(x);}
    84     return 0;    
    85 }
  • 相关阅读:
    困扰我的c++语法
    C++ primer第三章作业
    渔夫捕鱼问题
    JAVA输入输出
    Python学习5——抽象,涉及抽象和结构、函数的自定义、参数、作用域、递归
    牛顿迭代法计算平方根
    Python学习4——条件、循环及其他语句总结
    Python补充1——Python的简单推导
    Python补充2——Python单行注释、整段注释使用方法
    Python补充3——Python中的 split() 函数
  • 原文地址:https://www.cnblogs.com/chty/p/6040383.html
Copyright © 2011-2022 走看看