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

POJ2115 C Looooops【解线性同余方程】

时间:2015-02-22 21:55:24      阅读:166      评论:0      收藏:0      [点我收藏+]

标签:

题目链接:

http://poj.org/problem?id=2115


题目大意:

对于循环语句:

for(int i = A; i != B; i += C)

语句1;

已知i、A、B、C都是k进制的无符号整数类型,给出A、B、C、k的值,计算并输出语句1

的执行次数,如果为无限次,那么直接输出"FOREVER"。


思路:

设算法执行X步,那么题目就变为求解A + CX ≡ B( mod M)(M= 2^k)。即A + CX + MY ≡ B。

CX + MY ≡ B - A(M = 2^k),就变为了求 线性同余方程,简单的套用线性同余求解算法即可。


AC代码:

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

__int64 A,B,C,k;
__int64 a,b,c,d,x,y;

void ExGCD(__int64 a,__int64 b,__int64 &d,__int64 &x,__int64 &y)
{
    if(!b)
        x = 1, y = 0, d = a;
    else
    {
        ExGCD(b,a%b,d,y,x);
        y -= x * (a/b);
    }
}
int main()
{
    while(cin >> A >> B >> C >> k && (A||B||C||k) )
    {
        a = C;
        c = B - A;
        b = (__int64)1 << k;
        ExGCD(a,b,d,x,y);
        if(c % d != 0)
            cout << "FOREVER" << endl;
        else
        {
            __int64 ans,temp;
            ans = x * c/d;
            temp = b/d;
            ans = ans % temp + temp;
            cout << ans % temp << endl;
        }
    }

    return 0;
}



POJ2115 C Looooops【解线性同余方程】

标签:

原文地址:http://blog.csdn.net/lianai911/article/details/43909397

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