Time Limit: 5000MS | Memory Limit: 65536K | |
Total Submissions: 7301 | Accepted: 1807 |
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
Output
Sample Input
5 58 33 2 4 3 0 0 0
Sample Output
9No Solution
套模板
#include
#include
#include
#include
#include
#include
using namespace std;
#define CC(m ,what) memset(m , what , sizeof(m))
typedef __int64 LL ;
LL A, B ,C ;
const int NN = 99991 ;
bool hash[NN] ;
int idx[NN] , val[NN] ;
void insert(int id , LL vv)
{
LL v = vv % NN ;
while( hash[v] && val[v]!=vv)
{
v++ ;
if(v == NN) v-=NN ;
}
if( !hash[v] )
{
hash[v] = 1;
val[v] = vv ;
idx[v] = id ;
}
}
int find(LL vv)
{
LL v = vv % NN ;
while( hash[v] && val[v]!=vv)
{
v++ ;
if(v == NN) v-=NN ;
}
if( !hash[v] ) return -1;
return idx[v] ;
}
void ex_gcd(LL a , LL b , LL& x , LL& y)
{
if(b == 0)
{
x = 1 ;
y = 0 ;
return ;
}
ex_gcd(b , a%b , x, y) ;
LL t = x ;
x = y;
y = t - a/b*y ;
}
LL gcd(LL a,LL b)
{
while( a%b != 0)
{
LL c = a ;
a = b ;
b = c % b ;
}
return b ;
}
LL baby_step(LL A, LL B , LL C)
{
LL ans = 1 ;
for(LL i=0; i<=50; i++)
{
if(ans == B) return i ;
ans = ans * A % C ;
}
LL tmp , d = 0 ;
LL D = 1 % C ;
while( (tmp=gcd(A,C)) != 1 )
{
if(B % tmp) return -1 ;
d++ ;
B/=tmp ;
C/=tmp ;
D = D*A/tmp%C ;
}
CC( hash , 0) ;
CC( idx, -1) ;
CC(val , -1) ;
LL M = ceil( sqrt(C*1.0) ) ;
LL rr = 1 ;
for(int i=0; i