您的位置:首页 > 其它

poj解题报告——1061

2014-11-02 20:07 211 查看
刚看到这题的时候,以为是一道不定方程的题,后来看着看着就不对劲了,然后我想起了暑期集训的时候老师提过的扩展算法——gcd。

欧几里得算法的拓展应用中有如下三条定理:

定理一:如果d = gcd(a, b),则必能找到正的或负的整数k和l,使d = a*x+ b*y。

定理二:若gcd(a, b) = 1,则方程ax ≡ c (mod b)在[0, b-1]上有唯一解。

定理三:若gcd(a, b) = d,则方程ax ≡ c (mod b)在[0, b/d - 1]上有唯一解。

代码如下

#include<stdio.h>

__int64 exgcd(__int64 a,__int64 b,__int64 x,__int64 y)

{

__int64 r,t;

if(b==0)

{

x=1;

y=0;

return a;

}

r=exgcd(b,a%b,x,y);

t=x;

x=y;

y=t-a/b*y;

return r;

}

void main()

{

__int64 x,y,m,n,l,i,j,d,r;

scanf("%I64d%I64d%I64d%I64d%I64d",&x,&y,&m,&n,&l);

d=exgcd(n-m,l,i,j);

if((x-y)%d!=0)

printf("Impossible\n");

else

{

i=i*((x-y)/d);

r=l/d;

i=(i%r+r)%r;

printf("%I64d\n",i);

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: