zoukankan      html  css  js  c++  java
  • 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
    ");
                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
    ");
                continue;
            }
            x=x*c/gcd;
            x=(x%(b/gcd)+(b/gcd))%(b/gcd);
            cout<<x<<endl;
        }
    }
    View Code
  • 相关阅读:
    phpexcel 字符串转码
    thinkphp 3.2 linux二级目录安装
    linux 系统、命令、软件
    thinkphp3.2和phpexcel导入
    苹果手机微信分享代码失效
    thinkphp3.2与phpexcel带图片生成 完美案例
    thinkphp3.2与phpexcel基础生成
    thinkphp 3.2加载类
    thinkphp 3.2与phpexcel
    thinkphp 导出exl功能
  • 原文地址:https://www.cnblogs.com/harden/p/5645039.html
Copyright © 2011-2022 走看看