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

题目链接:

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;
}
时间: 2024-10-24 18:38:20

POJ2115 C Looooops【解线性同余方程】的相关文章

POJ2115 C Looooops(线性同余方程)

无符号k位数溢出就相当于mod 2k,然后设循环x次A等于B,就可以列出方程: $$ Cx+A \equiv B \pmod {2^k} $$ $$ Cx \equiv B-A \pmod {2^k} $$ 最后就用扩展欧几里得算法求出这个线性同余方程的最小非负整数解. 1 #include<cstdio> 2 #include<cstring> 3 #define mod(x,y) (((x)%(y)+(y))%(y)) 4 #define ll long long 5 ll e

POJ 2115C Looooops[一元线性同余方程]

一元线性同余方程 定义: $a$,$b$是整数,$m$是正整数,形如 $ax\equiv b\,(mod\, m)$ 且$x$是未知数的同余式称作一元线性同余方程. 对于方程$ax\equiv b\,(mod\, m)$, 可以把它写成二元一次不定式$ax+my=b$.要想方程有解,必须满足$(a,m)\mid d$. 这时利用扩展欧几里得求出$ax+my=(a,m)$ 的一个特解,在乘上$b/(a,m)$就是我们所要的一个特解. 利用公式: $ax_0+my_0=d=ax+my\Rightar

解线性同余方程组-模板

1 int n; 2 LL a[K],b[K]; 3 LL gcd(LL a,LL b) 4 { 5 return b==0?a:gcd(b,a%b); 6 } 7 void exgcd(LL a,LL b,LL &d,LL &x,LL &y) 8 { 9 if(b==0) 10 { 11 x=1;y=0;d=a; 12 return; 13 } 14 exgcd(b,a%b,d,y,x); 15 y-=x*(a/b); 16 } 17 LL slove(void)//x=b[i]

POJ 2065 SETI 高斯消元解线性同余方程

题意: 给出mod的大小,以及一个不大于70长度的字符串.每个字符代表一个数字,且为矩阵的增广列.系数矩阵如下 1^0 * a0 + 1^1 * a1 + ... + 1^(n-1) * an-1 = f(1) 2^0 * a0 + 2^1 * a1 + ... + 2^(n-1) * an-1   = f(2) ........ n^0 * a0 + n^1 * a1 + ... + n^(n-1) * an-1  = f(n) 快速幂取模下系数矩阵 #include <cstdio> #i

POJ 2115 C Looooops (线性同余方程)

C Looooops Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 19141   Accepted: 5049 Description A Compiler Mystery: We are given a C-language style for loop of type for (variable = A; variable != B; variable += C) statement; I.e., a loop w

codeforces 710D Two Arithmetic Progressions(线性同余方程)

题目链接: http://codeforces.com/problemset/problem/710/D 分析:给你两个方程 a1k + b1 and a2l + b2,求在一个闭区间[L,R]中有多少个X,X满足 x = a1k' + b1 = a2l' + b2. 由此可以发现这两个方程满足线性同余,即 x ≡b1mod(a1) 且 x≡b2mod(a2); 也就是 a1k' + b1 = a2l' + b2a. 所以 a1k1 + (-a2k2) = (b2 - b1),由同余方程得 :

数论 - n元线性同余方程的解法

note:n元线性同余方程因其编程的特殊性,一般在acm中用的很少,这里只是出于兴趣学了一下 n元线性同余方程的概念: 形如:(a1*x1+a2*x2+....+an*xn)%m=b%m           ..................(1) 当然也有很多变形,例如:a1*x1+a2*x2+...+an*xn+m*x(n+1)=b.这两个都是等价的. 判断是否有解: 解线性同余方程,我们首先要来判断方程是否有解,方程有解的充要条件是:d%b==0.其中d=gcd(a1,a2,...an)

『线性同余方程和中国剩余定理』

线性同余方程 定义 给定整数\(a,b,m\),对于形如\(ax\equiv b(mod\ m)\)的同余方程我们称之为一次同余方程,即线性同余方程. 解线性同余方程 对于此类方程,我们可以用如下方法快速的求解. \[ ax\equiv b(mod\ m)?m|ax-b \] 不妨设\(-ym=ax-b\),则可以将方程改写为\(ax+my=b\),该不定方程可以使用扩展欧几里得算法快速地求解(详见『扩展欧几里得算法 Extended Euclid』). 对于\(gcd(a,m)\not |b\

POJ 2115 C Looooops (扩展欧几里德 + 线性同余方程)

分析:这个题主要考察的是对线性同余方程的理解,根据题目中给出的a,b,c,d,不难的出这样的式子,(a+k*c) % (1<<d) = b; 题目要求我们在有解的情况下求出最小的解,我们转化一下形式. 上式可以用同余方程表示为  a + k*c = (b) % (1<<d)   <-->  k*c = (b-a) % (1<<d)(中间应该是全等号,打不出来…).这就是我们想要的同余方程,根据我的个人习惯,我把它转化为线性方程的形式. -->   c*