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
hdu 2815 Mod Tree
  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!\n");

118             continue;

119         }

120         if(C==1)

121         {

122             printf("0\n");

123             continue;

124         }

125         LL cur=baby_step(A,B,C);

126         if(cur==-1)

127         {

128             printf("Orz,I can’t find D!\n");

129         }

130         else printf("%I64d\n",cur);

131     }

132     return 0;

133 }

 

你可能感兴趣的:(tree)