zoukankan      html  css  js  c++  java
  • hdu 2815 Mod Tree

    Mod Tree

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
    Total Submission(s): 3543    Accepted Submission(s): 917


    Problem Description

      The picture indicates a tree, every node has 2 children.
      The depth of the nodes whose color is blue is 3; the depth of the node whose color is pink is 0.
      Now out problem is so easy, give you a tree that every nodes have K children, you are expected to calculate the minimize depth D so that the number of nodes whose depth is D equals to N after mod P.
     
    Input
    The input consists of several test cases.
    Every cases have only three integers indicating K, P, N. (1<=K, P, N<=10^9)
     
    Output
    The minimize D.
    If you can’t find such D, just output “Orz,I can’t find D!”
     
    Sample Input
    3 78992 453 4 1314520 65536 5 1234 67
     
    Sample Output
    Orz,I can’t find D! 8 20
     
    Author
    AekdyCoin
     
    Source
     
    Recommend
    lcy
     
     
    题目意思 k^x (mod P) =  N
    1.当N>=P,显然无解。
    2.当P=1  ,显然为0。
    为什么上一题poj3243那题 没有讨论这个呢。
    上一题的意思是 A^x % C = B % C ,所以没有1的判断
     
    这道题的输出很坑的,要特别注意。
     
      1 #include<iostream>
      2 #include<cstdio>
      3 #include<cstdlib>
      4 #include<cstring>
      5 #include<cmath>
      6 using namespace std;
      7 const int MAX=499991;
      8 typedef __int64 LL;
      9 LL A,B,C;
     10 bool Hash[MAX];
     11 LL val[MAX];
     12 LL idx[MAX];
     13 
     14 LL gcd(LL a,LL b)
     15 {
     16     if(b==0)
     17     return a;
     18     return gcd(b,a%b);
     19 }
     20 
     21 void Ex_gcd(LL a,LL b,LL &x,LL &y)
     22 {
     23     if(b==0)
     24     {
     25         x=1;
     26         y=0;
     27         return ;
     28     }
     29     Ex_gcd(b,a%b,x,y);
     30     LL hxl=x-a/b*y;
     31     x=y;
     32     y=hxl;
     33     return ;
     34 }
     35 
     36 void Insert(LL id,LL num)//哈希建立
     37 {
     38     LL k=num%MAX;
     39     while(Hash[k] && val[k]!=num)
     40     {
     41         k++; if(k==MAX) k=k-MAX;
     42     }
     43     if(!Hash[k])
     44     {
     45         Hash[k]=true;
     46         val[k]=num;
     47         idx[k]=id;
     48     }
     49     return;
     50 }
     51 
     52 LL found(LL num)//哈希查询
     53 {
     54     LL k=num%MAX;
     55     while(Hash[k] && val[k]!=num)
     56     {
     57         k++;
     58         if(k==MAX) k=k-MAX;
     59     }
     60     if(Hash[k])
     61     {
     62         return idx[k];
     63     }
     64     return -1;
     65 }
     66 
     67 LL baby_step(LL a,LL b,LL c)
     68 {
     69     LL temp=1;
     70     for(LL i=0;i<=100;i++)
     71     {
     72         if(temp==b) return i;
     73         temp=(temp*a)%c;
     74     }
     75     LL tmp,D=1,count=0;
     76     memset(Hash,false,sizeof(Hash));
     77     memset(val,-1,sizeof(val));
     78     memset(idx,-1,sizeof(idx));
     79 
     80     while( (tmp=gcd(a,c))!=1 )
     81     {
     82         if(b%tmp) return -1;
     83         c=c/tmp;
     84         b=b/tmp;
     85         D=D*a/tmp%c;
     86         count++;
     87     }
     88     LL cur=1;
     89     LL M=ceil(sqrt(c*1.0));
     90     for(LL i=1;i<=M;i++)//初始的时候,i=0开始,错了。!!?
     91     {
     92         cur=cur*a%c;
     93         Insert(i,cur);
     94     }
     95     LL x,y;
     96     for(LL i=0;i<=M;i++)
     97     {
     98         Ex_gcd(D,c,x,y);
     99         x=x*b%c;
    100         x=(x%c+c)%c;
    101         LL k=found(x);
    102         if(k!=-1)
    103         {
    104             return i*M+k+count;
    105         }
    106         D=D*cur%c;
    107     }
    108     return -1;
    109 }
    110 
    111 int main()
    112 {
    113     while(scanf("%I64d%I64d%I64d",&A,&C,&B)>0)
    114     {
    115         if(B>=C)
    116         {
    117             printf("Orz,I can’t find D!
    ");
    118             continue;
    119         }
    120         if(C==1)
    121         {
    122             printf("0
    ");
    123             continue;
    124         }
    125         LL cur=baby_step(A,B,C);
    126         if(cur==-1)
    127         {
    128             printf("Orz,I can’t find D!
    ");
    129         }
    130         else printf("%I64d
    ",cur);
    131     }
    132     return 0;
    133 }
  • 相关阅读:
    yii2 gii 命令行自动生成控制器和模型
    控制器中的方法命名规范
    Vue Property or method "" is not defined on the instance but referenced during render. Make sure that this property is reactive, either in the data option, or for class-based
    IDEA插件:GsonFormat
    Spring Boot : Access denied for user ''@'localhost' (using password: NO)
    Typora添加主题
    Git基础命令图解
    Java Joda-Time 处理时间工具类(JDK1.7以上)
    Java日期工具类(基于JDK1.7版本)
    Oracle SQL Developer 连接Oracle出现【 状态: 失败 -测试失败: ORA-01017: invalid username/password; logon denied】
  • 原文地址:https://www.cnblogs.com/tom987690183/p/3284138.html
Copyright © 2011-2022 走看看