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 |
UP!因为这个Submit 快一百次了In Reply To:大家帮我看看这题?全用经典算法,为什么还TLE?谢谢了 Posted by:sunmoonstar_love at 2005-06-26 20:28:06 > #include <stdio.h> > #include <stdlib.h> > > _int64 GCD(_int64 m, _int64 n) > { > if(m<2||n<2) > return 1; > while(true) > { > m = m % n; > if(m==0) > return n; > n = n % m; > if(n==0) > return m; > } > } > _int64 rnd(_int64 n) > { > _int64 r = rand(); > r = r>0?r:-r; > return r%n; > } > _int64 factoring(_int64 n) > { > srand(rand()); > _int64 i=1,x0=rnd(n),y=x0,k=2,x1,d; > while(true) > { > i++; > x1 = (x0*x0-1)%n; > d = GCD(y-x1,n); > if(d!=1 && d!=n) > return d; > if(i==k) > { > y = x0 = x1; k = 2*k; > } > else > x0 = x1; > } > } > _int64 c,e,n,p,q,d,m,t,i; > > _int64 mod_ex(_int64 a, _int64 b, _int64 n) > { > _int64 d = 1; > while(b>0) > { > if(b%2==1) > d=(d*a)%n; > b=b/2; > a=(a*a)%n; > } > return d; > } > _int64 GCD_ADV(_int64 a, _int64 n, _int64 &x,_int64 &y) > { > if(a<1 || n<1) > { > return -1; > } > _int64 x1,y1,c,d,q,r,t; > x = y1 = 0; y = x1 = 1; c = a; d = n; > while(true) > { > q = c / d; > r = c % d; > if(r==0) > { > return d; > } > c = d; d = r; > t = x1; x1 = x; x = t - q*x; > t = y1; y1 = y; y = t - q*y; > } > return 0; > } > > _int64 mod_linear(_int64 a,_int64 b,_int64 n) > { > _int64 d,x,y,e,i; > d = GCD_ADV(a,n,x,y); > e = (x*(b/d)) % n; > if(e<0) > e += n; > return e; > } > > int main() > { > while(scanf("%I64d%I64d%I64d",&c,&e,&n)!=EOF) > { > p = factoring(n);//分解出质因子 > q = n / p; //另一个质因子 > t = (p-1)*(q-1); > d = mod_linear(e,1,t); //解模线性方程 > m = mod_ex(c,d,n); // 模取蜜算法 > printf("%lld\n",m); > } > return 0; > } Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator