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 |
:) 好麻烦的方法啊In Reply To:请各位帮忙看一下为什么会WA Posted by:zouyuanrenren at 2006-04-04 06:41:28 > // 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