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

POJ2115 C Looooops 解一元线性同余方程

2015-06-05 15:45 309 查看
题目链接:http://poj.org/problem?id=2115

题目大意:有代码段for(variable=A;variable!=B;variable+=C) statement;已知所用到数都是mod 2^k的数,问你statement语句一共执行了多少次,如果循环为死循环,输出FOREVER.

分析:同余方程求解 相当于求A+Cx≡B(mod 2^k)的最小正整数解x。

实现代码如下:

#include <iostream>
#include <cstdio>
using namespace std;
typedef long long LL;
LL a,b,d,m,x,y;
void exgcd(LL a,LL b,LL &d,LL &x,LL &y)
{//扩展欧几里得算法
if(!b)
{
x=1,y=0,d=a;
return ;
}
else
{
exgcd(b,a%b,d,x,y);
LL temp=x;
x=y;
y=temp-(a/b)*y;
}
}
int main()
{
LL k,c;
while(scanf("%lld%lld%lld%lld",&a,&b,&c,&k))
{
if(a==0&&b==0&&c==0&&k==0) break;
m=(LL)1<<k;
b=b-a;
a=c;
exgcd(a,m,d,x,y);
if(b%d) puts("FOREVER");
else
{
x=x*(b/d)%m; //方程ax=b(mod m)的最小解
x=(x%(m/d)+m/d)%(m/d); //方程ax=b(mod m)的最小整数解
printf("%lld\n",x);
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: