zoukankan      html  css  js  c++  java
  • hdu 2815 Mod Tree 高次方程,n不为素数

      1 Accepted   406MS   8576K   2379 B    C++/**
      2 这里加了一点限制,,大体还是一样的,,
      3  
      4 **/
      5 #include <iostream>
      6 #include <cstdio>
      7 #include <cmath>
      8 #include <cstring>
      9 #include <algorithm>
     10 using namespace std;
     11 long long a,b,n;
     12 const int maxn = 499991;
     13 bool Hash[maxn];
     14 long long val[maxn];
     15 long long idx[maxn];
     16 
     17 long long gcd(long long a,long long b){
     18     if(b==0)
     19         return a;
     20     return gcd(b,a%b);
     21 }
     22 
     23 void ex_gcd(long long a,long long b,long long &x,long long &y){
     24     if(b==0){
     25         x=1;
     26         y=0;
     27         return ;
     28     }
     29     ex_gcd(b,a%b,x,y);
     30     long long tmp= x-(a/b)*y;
     31     x = y;
     32     y = tmp;
     33     return ;
     34 }
     35 
     36 void Insert(long long id,long long num){
     37     long long k = num%maxn;
     38     while(Hash[k]&&val[k]!=num){
     39         k++;
     40         if(k==maxn) k = k-maxn;
     41     }
     42     if(!Hash[k]){
     43         Hash[k] = true;
     44         val[k] = num;
     45         idx[k] = id;
     46     }
     47     return;
     48 }
     49 
     50 long long found(long long num){
     51     long long k = num%maxn;
     52     while(Hash[k]&&val[k]!=num){
     53         k++;
     54         if(k==maxn) k-=maxn;
     55     }
     56     if(Hash[k]){
     57         return idx[k];
     58     }
     59     return -1;
     60 }
     61 
     62 long long baby_step(long long a,long long b,long long n){
     63     long long temp =1;
     64     long long i;
     65     for(i=0;i<=100;i++){
     66         if(temp==b%n) return i;
     67         temp = temp*a%n;
     68     }
     69     long long tmp,d =1,cnt=0;
     70     memset(Hash,false,sizeof(Hash));
     71     memset(val,-1,sizeof(val));
     72     memset(idx,-1,sizeof(idx));
     73 
     74     while((tmp=gcd(a,n))!=1){
     75         if(b%tmp)
     76             return -1;
     77         cnt++;
     78         n = n/tmp;
     79         b = b/tmp;
     80         d =d*a/tmp%n;
     81     }
     82     long long cur =1;
     83     long long m = ceil(sqrt(n+0.5));
     84     for(i=0;i<m;i++){
     85         Insert(i,cur);
     86         cur = cur*a%n;
     87     }
     88     long long x,y;
     89     for(i=0;i<m;i++){
     90         ex_gcd(d,n,x,y);
     91         x = x*b%n;
     92         x = (x%n+n)%n;
     93         long long k = found(x);
     94         if(k!=-1)
     95             return i*m+k+cnt;
     96         d = d*cur%n;
     97     }
     98     return -1;
     99 }
    100 
    101 int main()
    102 {
    103     while(scanf("%I64d%I64d%I64d",&a,&n,&b)==3){
    104         if(b>=n){
    105             printf("Orz,I can’t find D!
    ");
    106             continue;
    107         }
    108         if(n==1){
    109             printf("0
    ");
    110             continue;
    111         }
    112         long long res = baby_step(a,b,n);
    113         if(res==-1){
    114             printf("Orz,I can’t find D!
    ");
    115         }else{
    116             printf("%I64d
    ",res);
    117         }
    118     }
    119     return 0;
    120 }
  • 相关阅读:
    Xcode4快速Doxygen文档注释 — 简明图文教程(3分钟后爽歪歪)
    ACE小记
    【C++】获得本机所有网卡的IP和MAC地址信息(转)
    一周好文(11)
    cocos2d‘s replaceScene
    iPhone 真机调试安装流程
    金牌银牌铜牌
    整数分割(摘抄)

    马拦过河卒
  • 原文地址:https://www.cnblogs.com/Bang-cansee/p/3724226.html
Copyright © 2011-2022 走看看