C Looooops POJ - 2115

擴展歐幾里得算法
題目描述:算循環的次數,初始值爲A,跳出循環的條件是A!=B,A每次+C,設所有的運算都是二進制k位數,運用補碼的原理,當x=2^k,則x+1溢出後=1.
解題思路:擴展歐幾里得算法。推一下方程,令所求的次數爲x (A+Cx)%2^k=B ->
A+Cx=2^k*y+B ->移項得Cx-2^k*y=B-A; 將各參數代入函數即可。

代碼如下:

#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;

long long exgcd(long long a,long long b,long long &x,long long &y)
{
    if(b==0)
    {
        x=1;
        y=0;
        return a;
    }
    long long ans=exgcd(b,a%b,x,y);
    long long t=y;
    y=x-(a/b)*y;
    x=t;
    return ans;
}

int main()
{
    int A,B,C,K;
    while(scanf("%d %d %d %d",&A,&B,&C,&K)==4&&(A||B||C||K))
    {
        long long a=C,b=(long long)1<<K,c=B-A,x,y;
        long long gcd=exgcd(a,b,x,y);
        if(c%gcd)
        {
             printf("FOREVER\n");
        }
        else
        {
            long long  x0=x*(c/gcd)%(b/gcd);
            x=(x0+(b/gcd))%(b/gcd);
            printf("%I64d\n",x);
        }
    }
    return 0;
}


發佈了46 篇原創文章 · 獲贊 6 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章