关闭

poj 2115 C Looooops (扩展欧几里得)

173人阅读 评论(0) 收藏 举报
分类:

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

for (variable = A; variable != B; variable += C)

  statement;
题意:在k位的系统内执行这个for循环,问这个循环多少次结束,k为的系统能表示的最大的数为2^k,超出2^k就从0开始

思路:由题意可得出公式(A + C*x) % 2^k = B,由同余模公式得(A%2^k + (C*x%2^k)) % 2^k = B

A + (C*x%2^k)) = B,    C*x%2^k) = B-A,  C*x ≡ (B-A) (mod) 2^k,即转换成标准的同余方程,根据扩展欧几里得求C的最小逆元就可以了

#include <iostream>
#include <queue>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <cstdlib>
#include <limits>
#include <stack>
#include <vector>
#include <map>

using namespace std;

#define N 1002000
#define INF 0xfffffff
#define PI acos (-1.0)
#define EPS 1e-8
#define met(a, b) memset (a, b, sizeof (a))

typedef long long LL;

void Ex_gcd (LL a, LL b, LL &gcd, LL &x, LL &y)
{
    if (!b)
    {
        x = 1;
        y = 0;
        gcd = a;
    }
    else
    {
        Ex_gcd (b, a%b, gcd, y, x);
        y -= a/b*x;
    }
}

int main ()
{///C*x ≡ (B-A) (mod 2^k)
    LL A, B, C, k;
    while (scanf ("%I64d %I64d %I64d %I64d", &A, &B, &C, &k), A+B+C+k)
    {
        LL a = C, b = 1LL<<k;
        LL mod = (B-A+b)%b, x, y, gcd;

        Ex_gcd (a, b, gcd, x, y);

        if (mod%gcd)
        {
            puts ("FOREVER");
            continue;
        }

        x = x * (mod/gcd) % b;
        x = (x%(b/gcd) + b/gcd) % (b/gcd);

        printf ("%I64d\n", x);
    }
    return 0;
}


2
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

POJ 2115 扩展欧几里得

C Looooops Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 21071 Accepted: 5717 DescriptionA Compiler Mystery: We are given a C-langua...
  • qq_22902423
  • qq_22902423
  • 2016-01-23 15:05
  • 803

C Looooops(欧几里德+poj2115)

C Looooops Description A Compiler Mystery: We are given a C-language style for loop of type for (variable = A; variable != B; variable += C) state...
  • u010579068
  • u010579068
  • 2015-05-02 17:35
  • 1738

POJ - 2115 C Looooops (扩展欧几里得)

拓展欧几里德  算是套公式的题目吧,反正开始很sb,没用脑子 下面的代码中 前面很好理解(前提是看懂了拓展欧几里得) 最后面 求 x ,得是 最小正整数解, 那两行也是套路吧,不是很理解,好几个提都得这样 ps:欧几里得不是很懂的 建议先搞明白,然后附带这逆元也会了 ...
  • xiang_6
  • xiang_6
  • 2017-05-20 18:45
  • 56

【POJ】2115 - C Looooops(扩展欧几里得)

点击打开题目 C Looooops Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 23259   Accepted: 6391 Desc...
  • wyg1997
  • wyg1997
  • 2016-08-01 16:24
  • 192

POJ 2115 C Looooops(扩展欧几里得)

Description A Compiler Mystery: We are given a C-language style for loop of type  for (variable = A; variable != B; variable += C) stateme...
  • ShannonNansen
  • ShannonNansen
  • 2015-08-21 16:30
  • 245

poj 2115 C Looooops 【扩展欧几里得】

C Looooops Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 20702   Accepted: 5596 ...
  • chenzhenyu123456
  • chenzhenyu123456
  • 2015-10-25 15:46
  • 597

POJ 2115 C Looooops(扩展欧几里得)

Description A Compiler Mystery: We are given a C-language style for loop of type  for (variable = A; variable != B; variable += C) statem...
  • u013582254
  • u013582254
  • 2015-08-10 18:53
  • 247

POJ 2115 C Looooops (扩展欧几里得)

Description A Compiler Mystery: We are given a C-language style for loop of type for (variable = A; variable != B; variable += C) statement; ...
  • qq_28954601
  • qq_28954601
  • 2017-01-27 17:45
  • 166

[ACM] POJ 2115 C Looooops (扩展欧几里得求解模线性方程)

解题思路: 参考:
  • sr19930829
  • sr19930829
  • 2014-07-23 09:24
  • 1223

POJ 2115 Looooops (扩展欧几里得+调整解)

题目大意:给出一组数 a b c k,问 a + mc = b(mod 2^k)的解m是多少,若有解,则输出最小正解的大小,若没有,输出FOREVER,表明a永远无法通过加c的方式得到b的值。解题思路:根据刚才列出的式子可以很容易的发现,此题可以直接使用扩展欧几里得算法求解,扩展欧几里得算法用于求解...
  • qq_37328747
  • qq_37328747
  • 2017-01-17 11:16
  • 155
    个人资料
    • 访问:75066次
    • 积分:3520
    • 等级:
    • 排名:第10914名
    • 原创:277篇
    • 转载:6篇
    • 译文:0篇
    • 评论:17条
    最新评论