C Looooops(poj 2115)

大致题意:

对于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

 

posted @ 2016-07-05 21:10  karles~  阅读(168)  评论(0编辑  收藏  举报