码迷,mamicode.com
首页 > 其他好文 > 详细

C Looooops(poj 2115)

时间:2016-07-05 22:33:40      阅读:222      评论:0      收藏:0      [点我收藏+]

标签:

大致题意:

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

 

C Looooops(poj 2115)

标签:

原文地址:http://www.cnblogs.com/harden/p/5645039.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!