您的位置:首页 > 运维架构

poj 2115 C Looooops 线性同余方程

2013-01-03 14:59 218 查看
  输入 A , B, C, k

  设 D = 2^k

  则存在 ( x, y ) 使

      A + C*x = B ( mod D )

  =>   A + C*x = B + D*y

  =>    C*x - D*y = B - A

  令 a = C, b = D, c = B-A

  则转换成线性同余方程 :

    a * x + b * y = c

  使用扩展欧基里德求解即可

解题代码

View Code

#include<stdio.h>
typedef long long LL;

LL ExGcd( LL a, LL b, LL &x, LL &y )
{
if( b == 0 ){ x=1;y=0;return a;}
LL d = ExGcd(b, a%b, x, y);
LL t = x; x = y; y = t-a/b*y;
return d;
}
LL Gcd( LL a, LL b )
{    return b == 0 ? a : Gcd( b, a%b ); }
int main()
{
LL A, B, C, D, k;
while( scanf("%lld%lld%lld%lld", &A,&B,&C,&k) , A+B+C+k )
{
D = (1LL)<<k;
LL x, y;
LL a = C, b = D, c = B-A;
LL d = Gcd( a, b );
if( c%d != 0 ) puts("FOREVER");
else
{
a /= d; b /= d; c /= d;
ExGcd( a, b, x, y );
x =((x*c)%b+b)%b;
printf("%lld\n", x);
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: