poj 3243 Clever Y

Clever Y
Time Limit: 5000MS   Memory Limit: 65536K
Total Submissions: 5744   Accepted: 1376

Description

Little Y finds there is a very interesting formula in mathematics:

XY mod Z = K

Given X, Y, Z, we all know how to figure out K fast. However, given X, Z, K, could you figure out Y fast?

Input

Input data consists of no more than 20 test cases. For each test case, there would be only one line containing 3 integers X, Z, K (0 ≤ X, Z, K ≤ 109). 
Input file ends with 3 zeros separated by spaces. 

Output

For each test case output one line. Write "No Solution" (without quotes) if you cannot find a feasible Y (0 ≤ Y < Z). Otherwise output the minimum Y you find.

Sample Input

5 58 33
2 4 3
0 0 0

Sample Output

9
No Solution


这题数据不强。第二种类型,C是任意的非负整数。
这个时候要用到的,不断地缩小,直到互质。代码...可以当一个模板用。 详细的报告:http://blog.csdn.net/tsaid/article/details/7354716
  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%c) 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++)
 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 
112 int main()
113 {
114     while(scanf("%I64d%I64d%I64d",&A,&C,&B)>0)
115     {
116         if(A==0&&B==0&&C==0)break;
117         LL cur=baby_step(A,B,C);
118         if(cur==-1)
119         {
120             printf("No Solution\n");
121         }
122         else printf("%I64d\n",cur);
123     }
124     return 0;
125 }

 


posted @ 2013-08-27 08:41  芷水  阅读(227)  评论(0编辑  收藏  举报