Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
请各位帮忙看一下为什么会WA// alg:扩展欧几里德算法证明以及算法如下: // K*e mod f = d (e,f,d为已知量) [c] // 设e'为 e 关于f的乘法逆元 (什么是乘法逆元?若e'满足e*e' mod f =1 则称e'为 e 关于f的乘法逆元) 则有 // e'*e mod f= 1 根据模运算性质有 // d*(e'*e) mod f=d*1=d [d] // 对比 [c] [d] 不难发现 k=d*e' mod f // 所以问题转为求e的乘法逆元e' 用扩展的欧几里德算法 可以求e' .算法描述如下 // ExtendedEuclid(e,f) // 1 (X1,X2,X3):=(1,0,f) // 2 (Y1,Y2,Y3):=(0,1,e) // 3 if (Y3=0) then return e'=null//无逆元 // 4 if (Y3=1) then return e'=Y2 //Y2为逆元 // 5 Q:=X3 div Y3 // 6 (T1,T2,T3):=(X1-Q*Y1,X2-Q*Y2,X3-Q*Y3) // 7 (X1,X2,X3):=(Y1,Y2,Y3) // 8 (Y1,Y2,Y3):=(T1,T2,T3) // 9 goto 3 #include <iostream> #include <stdio.h> using namespace std; _int64 eo(_int64 e, _int64 f) { _int64 x1 = 1, x2 = 0, x3 = f; _int64 y1 = 0, y2 = 1, y3 = e; _int64 t1, t2, t3; _int64 q; while(y3) { if(y3 == 1) return y2; q = x3 / y3; t1 = x1 - q * y1; t2 = x2 - q * y2; t3 = x3 - q * y3; x1 = y1; x2 = y2; x3 = y3; y1 = t1; y2 = t2; y3 = t3; } return 0; } int main() { _int64 x, y, m, n; _int64 v, d; _int64 L; _int64 j, c; _int64 e; scanf("%I64d%I64d%I64d%I64d%I64d",&x,&y,&m,&n,&L); if(m > n) { v = (m - n) % L; d = (x - y + L) % L; } else { v = (n - m) % L; d = (y - x + L) % L; } c = L - d; e = eo(v, L); if(e == 0) { cout<<"Impossible"<<endl; return 0; } else { j = ((e * c) % L + L) % L; } printf("%I64d\n", j); return 0; } Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator