题意:

对于for(i=A ; i!=B ;i+=C)循环语句,问在k位存储系统中循环几次才会结束。
  比如:当k=4时,存储的数 i 在0-15之间循环。(本题默认为无符号)

  若在有限次内结束,则输出循环次数。

  否则输出死循环。

二,思路:
本题利用扩展欧几里德算法求线性同余方程,设循环次数为 x ,则解方程 (A + C*x) % 2^k = B;求出最小正整数 x。 
  1,化简方程化为求线性同余方程标准式 ax ≡ b (mod n);
  2,扩展欧几里德算法求解线性同余方程 C*x ≡ B-A (mod 2^k);上面的红色公式转化为这个式子没有看懂(两者之间的转化)
  3,求出最小非负整数解。

1、化简:(A + C*x) mod 2^K = B  -->  C*x mod 2^k = B-A  -->   C*x ≡ B-A (mod 2^k);

(A+x*C)%(2^k)=B 变形(2^k)*y+B=A+C*x ==>  C*x+(-(2^k)*y)=B-A;这个变形比较实用吧

2、求线性同余方程 C*x ≡ B-A (mod 2^k) ,

就相当于求二元一次方程 C*x + 2^k * y = B-A

  i,代入扩展欧几里德算法,求解方程 C*x + 2^k * y = gcd(C , 2^k) ;

  ii,利用方程 C*x + 2^k * y = gcd(C , 2^k)的解 x0 和x1 = x0 * c/d 求出原方程 a*x + b*y = c 的解 x1 ;前提是:d|c (c 能被 d 整除);

3、利用周期性变化求最小的非负整数解 公式: x1 = (x1 % (b/d) + (b/d) ) % (b/d);
      若方程的C*x + 2^k * y = B-A 的一组整数解为(x1 , y1),则它的任意整数解为(x1 + k * (b/d) , y1 - k * (a/d) ) ( k取任意整数 ), T = b/d就为 x1 增长的周期 
     i,若x1为负值,取最大的非正值:x1 = x1 % T ; 若x1为正值,以下两步无影响; 
     ii,取正 :x1 = x1 + T ;

     iii, 防止 i 中的 x1=0 即 ii 中的 x1=T :x1 = x1 % T ;

看到数论概论中的得到的一些总结(和上面的(2)ii类似:

已知ax+by=1的一组解为(x1,y1),那么其他组的解为(x1+k*b,y1-k*a)(k为任意整数)

当ax+by=gcd(a,b)=d时,其他组的解变为(x1+k*b/d,y1-k*a/d),因此b/d就成为了一个增长周期

#include <iostream>
using namespace std;
void exgcd(long long a,long long b,long long &d,long long &x,long long &y)
{if(!b)//b==0说明上层a%b==0上层的b(这层的a)为最大公因数,则a*x+b*y=a{d=a; //递归到这时候a就是最大公因数( d用来存储gcd(a,b)的值)//结合上一层exgcd(b,a%b,d,y,x)x=1;y=0;}else{exgcd(b,a%b,d,y,x);y=y-x*(a/b);//...........}
}
int main()
{long long A,B,C,x,y,T,d;int k;while(cin>>A>>B>>C>>k&&(A+B+C+k)){long long n=1LL<<k;//n = 1 * 2^k ;exgcd(C,n,d,x,y);//a*x + b*y = c ,C*x + 2^k * y =B-Aif((B-A)%d!=0)//上面(2)中的性质ii{cout<<"FOREVER"<<endl;continue;}x=x*(B-A)/d;T=n/d;x=(x%T+T)%T;cout<<x<<endl;}return 0;
}

poj 2115 C Looooops(扩展欧几里德算法)相关推荐

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

    辗转相除法(欧几里得算法) 时间复杂度:在O(logmax(a, b))以内 int gcd(int a, int b) {if (b == 0) return a;return gcd(b, a % ...

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

    题目链接:点击查看 题目大意:执行一个循环: for (variable = A; variable != B; variable += C) statement; 问在2的k次幂的范围内最少需要执行 ...

  3. 青蛙的约会(POJ 1061 扩展欧几里德算法)

    POJ 1061 青蛙的约会 扩展欧几里德算法简单介绍及应用 题目大意: 两只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见一面.它们很高兴地发现它们住在同一条纬度线上,于是它们约定各自朝西跳, ...

  4. 集训笔记---扩展欧几里德算法(POJ NO.1061 青蛙的约会 有点烦人小跳蛙gcd)

    又在搬砖,本来以为这是一个追及问题,后来发现数据好像并不是那么个意思,后来把方程列出来,经过一个去模的操作,我们其实可以找到一点线索,那就是,一个经过变形的二元一次方程,那么在这种情况下,就可以利用扩 ...

  5. 欧几里德算法 扩展欧几里德算法

    欧几里德算法 欧几里德算法又称辗转相除法,是指用于计算两个正整数a,b的最大公约数. 计算公式:gcd(a,b) = gcd(b,a mod b). 算法实现: public static int g ...

  6. 扩展欧几里德算法详解

    转自:http://blog.csdn.net/zhjchengfeng5/article/details/7786595 扩展欧几里德算法 谁是欧几里德?自己百度去 先介绍什么叫做欧几里德算法 有两 ...

  7. 欧几里德与扩展欧几里德算法——密码学笔记(五)

    一.欧几里德算法 又称辗转相除法,用于计算两个整数a,b的最大公约数. 基本算法:设a=qb+r,其中a,b,q,r都是整数,则gcd(a,b)=gcd(b,r),即gcd(a,b)=gcd(b,a% ...

  8. 欧几里德算法与扩展欧几里德算法

    欧几里德算法 欧几里德算法又称辗转相除法,用于计算两个整数a,b的最大公约数. 基本算法:设a=qb+r,其中a,b,q,r都是整数,则gcd(a,b)=gcd(b,r),即gcd(a,b)=gcd( ...

  9. (扩展欧几里德算法)zzuoj 10402: C.机器人

    10402: C.机器人 Description Dr. Kong 设计的机器人卡尔非常活泼,既能原地蹦,又能跳远.由于受软硬件设计所限,机器人卡尔只能定点跳远.若机器人站在(X,Y)位置,它可以原地 ...

最新文章

  1. 上传图片,多图上传,预览功能,js原生无依赖
  2. 川大计算机考研2020招生数,四川大学等大学,2020年研究生招生简章发布,这3个信息很重要!...
  3. Apache的压缩与缓存-----网页优化
  4. Tcp三次握手和四次挥手状态图
  5. 评论中显示表情,苹果和安卓都一样
  6. oracle 实例多一些的书,Oracle+Database+11g+PLSQL编程实战(书+源码)
  7. stringWithUTF8String return null (返回null)的解决办法
  8. linux 下rpm软件的安装和卸载
  9. bootstarp怎么使盒子到最右边_江湖救急!盒子显示“很抱歉Launchercust 已停止运行” ?...
  10. 贪心算法c语言部分背包,c语言背包问题_背包问题贪心算法_背包问题 贪心算法(13)...
  11. 国际音标的显示和输入
  12. 【工具】在idea中使用svn
  13. 计算机系统时间在哪改,win10系统日期时间在哪里修改?win10修改电脑时间的方法...
  14. ORA-00932: 数据类型不一致: 应为 NUMBER, 但却获得 BINARY
  15. cad计算机绘图基础知识,CAD 计算机绘图基础课件.ppt
  16. html光圈效果,PS新手教程:特效光圈效果
  17. 850pro测试软件,三星850Pro ssd可靠性测试 6000次P/E
  18. c/c++原子锁应用(跨平台)
  19. Bayesian Browsing Model 的个人理解
  20. 使用sh执行bash脚本的奇怪问题

热门文章

  1. EM算法--应用到三个模型: 高斯混合模型 ,混合朴素贝叶斯模型,因子分析模型...
  2. 生活随笔[2005-06-06]
  3. AOP统一处理请求日志
  4. redis cluster 设置密码做集群时gem下client.rb文件修改
  5. 我在ChinaUnix上看到的有点点用的帖子
  6. Behavioral模式之Memento模式
  7. Python协程:从yield/send到async/await
  8. Caused by: android.content.res.Resources$NotFoundException: String resource ID #0x0
  9. Ural(Timus) 1081. Binary Lexicographic Sequence
  10. 解析Excel2007之Style、Drawing、Chart