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

C Looooops(poj 2115)

2016-07-05 21:10 429 查看
大致题意:

对于C的for(i=A ; i!=B ;i +=C)循环语句,问在k位存储系统中循环几次才会结束。

若在有限次内结束,则输出循环次数。

否则输出死循环。

解题思路:

题意不难理解,只是利用了 k位存储系统 的数据特性进行循环。

例如int型是16位的,那么int能保存2^16个数据,即最大数为65535(本题默认为无符号),

当循环使得i超过65535时,则i会返回0重新开始计数

如i=65534,当i+=3时,i=1

其实就是 i=(65534+3)%(2^16)=1

有了这些思想,设对于某组数据要循环x次结束,那么本题就很容易得到方程:

x=[(B-A+2^k)%2^k] /C

即 Cx=(B-A)(mod 2^k) 此方程为 模线性方程,本题就是求X的值。

//注意最后使x变为最小正整数的公式
#include<cstdio>
#include<iostream>
#define ll long long
using namespace std;
ll A,B,C,K;
ll e_gcd(ll a,ll b,ll &x,ll &y)
{
if(b==0)
{
x=1;y=0;
return a;
}
ll r=e_gcd(b,a%b,x,y);
ll t=x;x=y;y=t-a/b*y;
return r;
}
int main()
{
while(1)
{
cin>>A>>B>>C>>K;
if(A==0&&B==0&&C==0&&K==0)break;
if(A==B)
{
printf("0\n");
continue;
}
ll a=C,b=1LL<<K,c=B-A,x,y;
ll gcd=e_gcd(a,b,x,y);
if(c%gcd)
{
printf("FOREVER\n");
continue;
}
x=x*c/gcd;
x=(x%(b/gcd)+(b/gcd))%(b/gcd);
cout<<x<<endl;
}
}


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