• poj 1811 大数分解


    模板

      1 #include<stdio.h>
      2 #include<string.h>
      3 #include<stdlib.h>
      4 #include<time.h>
      5 #include<iostream>
      6 #include<string.h>
      7 #include<math.h>
      8 #include<algorithm>
      9 using namespace std;
     10 
     11 //****************************************************************
     12 // Miller_Rabin 算法进行素数测试
     13 //速度快,而且可以判断 <2^63的数
     14 //****************************************************************
     15 const int S=20;//随机算法判定次数,S越大,判错概率越小
     16 
     17 
     18 //计算 (a*b)%c.   a,b都是long long的数,直接相乘可能溢出的
     19 //  a,b,c <2^63
     20 long long mult_mod(long long a,long long b,long long c)
     21 {
     22     a%=c;
     23     b%=c;
     24     long long ret=0;
     25     while(b)
     26     {
     27         if(b&1){ret+=a;ret%=c;}
     28         a<<=1;
     29         if(a>=c)a%=c;
     30         b>>=1;
     31     }
     32     return ret;
     33 }
     34 
     35 
     36 
     37 //计算  x^n %c
     38 long long pow_mod(long long x,long long n,long long mod)//x^n%c
     39 {
     40     if(n==1)return x%mod;
     41     x%=mod;
     42     long long tmp=x;
     43     long long ret=1;
     44     while(n)
     45     {
     46         if(n&1) ret=mult_mod(ret,tmp,mod);
     47         tmp=mult_mod(tmp,tmp,mod);
     48         n>>=1;
     49     }
     50     return ret;
     51 }
     52 
     53 
     54 
     55 
     56 
     57 //以a为基,n-1=x*2^t      a^(n-1)=1(mod n)  验证n是不是合数
     58 //一定是合数返回true,不一定返回false
     59 bool check(long long a,long long n,long long x,long long t)
     60 {
     61     long long ret=pow_mod(a,x,n);
     62     long long last=ret;
     63     for(int i=1;i<=t;i++)
     64     {
     65         ret=mult_mod(ret,ret,n);
     66         if(ret==1&&last!=1&&last!=n-1) return true;//合数
     67         last=ret;
     68     }
     69     if(ret!=1) return true;
     70     return false;
     71 }
     72 
     73 // Miller_Rabin()算法素数判定
     74 //是素数返回true.(可能是伪素数,但概率极小)
     75 //合数返回false;
     76 
     77 bool Miller_Rabin(long long n)
     78 {
     79     if(n<2)return false;
     80     if(n==2)return true;
     81     if((n&1)==0) return false;//偶数
     82     long long x=n-1;
     83     long long t=0;
     84     while((x&1)==0){x>>=1;t++;}
     85     for(int i=0;i<S;i++)
     86     {
     87         long long a=rand()%(n-1)+1;//rand()需要stdlib.h头文件
     88         if(check(a,n,x,t))
     89             return false;//合数
     90     }
     91     return true;
     92 }
     93 
     94 
     95 //************************************************
     96 //pollard_rho 算法进行质因数分解
     97 //************************************************
     98 long long factor[100];//质因数分解结果(刚返回时是无序的)
     99 int tol;//质因数的个数。数组小标从0开始
    100 
    101 long long gcd(long long a,long long b)
    102 {
    103     if(a==0)return 1;//???????
    104     if(a<0) return gcd(-a,b);
    105     while(b)
    106     {
    107         long long t=a%b;
    108         a=b;
    109         b=t;
    110     }
    111     return a;
    112 }
    113 
    114 long long Pollard_rho(long long x,long long c)
    115 {
    116     long long i=1,k=2;
    117     long long x0=rand()%x;
    118     long long y=x0;
    119     while(1)
    120     {
    121         i++;
    122         x0=(mult_mod(x0,x0,x)+c)%x;
    123         long long d=gcd(y-x0,x);
    124         if(d!=1&&d!=x) return d;
    125         if(y==x0) return x;
    126         if(i==k){y=x0;k+=k;}
    127     }
    128 }
    129 //对n进行素因子分解
    130 void findfac(long long n)
    131 {
    132     if(Miller_Rabin(n))//素数
    133     {
    134         factor[tol++]=n;
    135         return;
    136     }
    137     long long p=n;
    138     while(p>=n)p=Pollard_rho(p,rand()%(n-1)+1);
    139     findfac(p);
    140     findfac(n/p);
    141 }
    142 int main()
    143 {
    144    // srand(time(NULL));//需要time.h头文件  //POJ上G++要去掉这句话
    145     int T;
    146     long long n;
    147     scanf("%d",&T);
    148     while(T--)
    149     {
    150         scanf("%I64d",&n);
    151         if(Miller_Rabin(n))
    152         {
    153             printf("Prime
    ");
    154             continue;
    155         }
    156         tol=0;
    157         findfac(n);
    158         long long ans=factor[0];
    159         for(int i=1;i<tol;i++)
    160           if(factor[i]<ans)
    161              ans=factor[i];
    162         printf("%I64d
    ",ans);
    163     }
    164     return 0;
    165 }
  • 相关阅读:
    vue:自定义指令
    vue 声明周期
    组件之间的通信
    vue动态组件keepalive
    vuecli的使用
    数据结构线性表(C#) 天高地厚
    HOOK钩子函数 天高地厚
    OSI模型 天高地厚
    HTTP 天高地厚
    说说JSONP 天高地厚
  • 原文地址:https://www.cnblogs.com/cnblogs321114287/p/4313261.html
Copyright © 2020-2023  润新知