数论好题。。 香!

首先我们看到这一题, 题意是

\[a + c * x \equiv b (mod \ \ 2 ^ k)
\]

对此式移一下项, 得

\[c * x \equiv b - a (mod \ \ 2 ^ k)
\]

此时原式为标准线性同余方程。

\(exgcd\)解得\(x\)后,x 要做如下处理 :

设\(g = gcd(b - a, 2 ^ k), k = 2 ^ k, d = b - a\)

1#. \(x = x * (d / g)\), 此时求得一组特解(因为\(exgcd\)解出的是\(RHS = gcd\)时的解,所以需要乘倍数)

2#. \(x = (x \% (k / g) + k / g) % (k / g)\), 此时求得最小正整数解。

\(\text{TIP : 1. 本题无需开int64 2. 1# 无需加%k}\)

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cmath>
  4. #define int long long
  5. using namespace std;
  6. int exgcd(int a, int b, int &x, int &y) {
  7. if(b == 0) {
  8. x = 1;
  9. y = 0;
  10. return a;
  11. }
  12. int g = exgcd(b, a % b, x, y);
  13. int tmp = x;
  14. x = y;
  15. y = tmp - (a / b) * y;
  16. return g;
  17. }
  18. signed main(){
  19. long long A, B, C, K;
  20. while (cin >> A >> B >> C >> K) {
  21. int a = A, b = B, c = C, k = K, x, y;
  22. x = 0, y = 0;
  23. if(!a && !b && !c && !k)
  24. break;
  25. k = pow(2, k);
  26. int d = b - a;
  27. int g = exgcd(c, k, x, y);
  28. if(d % g) {
  29. puts("FOREVER");
  30. } else {
  31. x = x * (d / g);
  32. printf("%lld\n", (x % (k / g) + k / g) % (k / g));
  33. }
  34. }
  35. return 0;
  36. }
  37. /*
  38. 2 4 6 3
  39. 11 27 20 5
  40. 850 1350 430 11
  41. 262135 352675 222524 19
  42. 0 0 0 0
  43. */

C Looooops POJ - 2115的更多相关文章

  1. C Looooops POJ - 2115 拓展gcd 有一个定理待补()

    补算法导论P564 MODULAR-LINEAR-EQUATION-SOLVER算法(P564)

  2. C Looooops POJ - 2115 (exgcd)

    一个编译器之谜:我们被给了一段C++语言风格的循环 for(int i=A;i!=B;i+=C) 内容; 其中所有数都是k位二进制数,即所有数时膜2^k意义下的.我们的目标时球出 内容 被执行了多少次 ...

  3. D - C Looooops POJ - 2115 欧几里德拓展

    题意:就是看看for(; ;)多久停止. 最让我蛋疼的是1L和1LL的区别!让我足足wa了12发! 1L 是long类型的, 1LL为long long类型的! 思路: 这就是欧几里德扩展的标准式子了 ...

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

    题目链接:https://cn.vjudge.net/contest/276376#problem/B 题目大意:for( int  i= A ; i != B; i+ = c ),然后给你A,B,C ...

  5. Day7 - F - C Looooops POJ - 2115

    A Compiler Mystery: We are given a C-language style for loop of type for (variable = A; variable != ...

  6. R - C Looooops POJ - 2115 (exgcd)

    题目大意:很好理解,一个for循环语句,从a开始到b结束,步长是c,模数是pow(2,k) 问,最少循环多少次,才能到达b,如果永远都到不了b,输出FOREVER 题解:其实就是求一个线性方程,cx= ...

  7. POJ 2115 C Looooops(扩展欧几里得应用)

    题目地址:POJ 2115 水题. . 公式非常好推.最直接的公式就是a+n*c==b+m*2^k.然后能够变形为模线性方程的样子,就是 n*c+m*2^k==b-a.即求n*c==(b-a)mod( ...

  8. 【题解】POJ 2115 C Looooops (Exgcd)

    POJ 2115:http://poj.org/problem?id=2115 思路 设循环T次 则要满足A≡(B+CT)(mod 2k) 可得 A=B+CT+m*2k 移项得C*T+2k*m=B-A ...

  9. POJ 2115 C Looooops(模线性方程)

    http://poj.org/problem?id=2115 题意: 给你一个变量,变量初始值a,终止值b,每循环一遍加c,问一共循环几遍终止,结果mod2^k.如果无法终止则输出FOREVER. 思 ...

随机推荐

  1. vue 项目抛出警告

    There are multiple modules with names that only differ in casing. 此图为 博主(初雪日)的截图, 这个问题虽然不报错,但是会对项目有影 ...

  2. 显示器类型对美乐威NDI IP转换器延时影响测试

    背景 用户在选择用网络传输视频时,传输延迟通常是他们非常关心的数据.集成商在探究如何降低视频传输延时,往往专注于网络本身和视频编码的优化,容易忽略视频解码和播出也是整个视频传输过程中非常重要的环节.本 ...

  3. Pytest框架中,conftest.py文件的作用?

    conftest.py文件,它主要是实现fixture共享的. 第一,conftest.py文件当中,它储存的都是fixture,就是给用例提供做前置准备工作和后置清理工作的一个东西: 第二,conf ...

  4. GPRS DTU工作的原理与应用场景

    GPRS DTU是属于物联网无线数据终端设备的中一种,它主要是利用公用运营商的GPRS网络(又称G网)来为用户提供无线长距离数据传输的功能.一般都是采用的高性能工业级8/16/32位通信处理器和工业级 ...

  5. Nodejs在VSCode下代码智能提示

    在学习Nodejs的过程中发现vscode下默认没有提示,在网上也测试了传统的一些方法,都不好用,最后找到这个npm install --save-dev @types/node

  6. .NetCore操作MongDB简要代码实现

    .NetCore操作MongoDB简要代码实现 在接触过的大多数使用mongodb的情景中,基本上都是用mongodb来存储日志的. mongodb是作为一种文档型的数据库,在管理日志文档上确实比较适 ...

  7. malloc,calloc,realloc三者的区别

    malloc,calloc,realloc三者都可以运用与动态分配数组. malloc:用malloc必须要自己初始化,可以用memset(arr,0,cnt*sizeof(int)) calloc: ...

  8. Visual Studio空格变成点的快捷键切换

    [Ctrl + R + W] 效果如下图

  9. windows鼠标右键文件太多

    1.网上找的(已经验证太难找,并没有多大用) 单击Windows的"开始"菜单,单击"运行",在"打开"框中键入"regedit& ...

  10. 14Flask重要知识

    一,李辉<Flask Web开发实战> 1,内网穿透 内网穿透工具可以快速让flask项目运行: 1,https://localtunnel.github.io/www/ 2,https: ...