题意:有一个在k位无符号整数下的模型:for (variable = A; variable != B; variable += C)  statement; 问循环的次数,若“永不停息”(←_←)*,就输出"FOREVER"。

解法:用拓展欧几里德方法求出gcd最大公因数,再利用同余性质转化,求同余方程,或者不定方程。其中题目可化为 a+cx=b(mod 2^k) → cx=b-a(mod 2^k),求最小正整数解。也是求解同余方程。

先将方程化为一般形式:ax=c(mod p) →  ax+py=c 。若 gcd(a,p)|c,就可以利用 ax+py=gcd(a,b)(mod p) [一般没有mod p] ,再把变量 x,y 乘上 c/gcd(a,b) 就是答案了。而要求最小正整数解,就是根据 ax+py=gcd(a,p) → a(x+p/gcd(a,p))+p(y-a/gcd(a,p)=gcd(a,p) ,所有的 x' 都满足 x+p/gcd(a,p) 来进行调整,并且取模。因为 每对 x 与 x' 都相差 p/gcd(a,p),那么根据同余的定义,x 和 x' 关于模 p/gcd(a,p) 同余,所以可以一直取模来调整。而对于 p/gcd(a,p) ,为正时取模才有保证最非负的意义。

注意——位运算超过30位时,尽管变量为long long,也要在之前加上强制转型(long long)。见代码的24行......之前我一次比赛,数组初始化是long long类型的,也要在数字后面加上"LL"或" l l "。

 1 #include<cstdio>
2 #include<cstdlib>
3 #include<cstring>
4 #include<iostream>
5 using namespace std;
6 typedef long long LL;
7
8 LL mabs(LL x) {return x>0?x:-x;}
9 LL exgcd(LL a,LL b,LL& x,LL& y)
10 {
11 if (!b) {x=1,y=0; return a;}
12 LL d,tx,ty;
13 d=exgcd(b,a%b,tx,ty);//bx'+(a%b)y'=1(mod p)
14 x=ty,y=tx-(a/b)*ty;//ay'+b(x'-t*y')=1(mod p)
15 return d;
16 }
17 int main()
18 {
19 LL aa,bb,cc,pp;
20 while (1)
21 {
22 scanf("%I64d%I64d%I64d%I64d",&aa,&bb,&cc,&pp);
23 if (!aa && !bb && !cc && !pp) break;
24 LL a=cc,b=(LL)1<<pp,c=bb-aa,p=(LL)1<<pp;
25 LL d,x,y;//cx=b-a(mod 2^k)-->cx+2^k*y=b-a-->gcd(c,2^k)=1才有解
26 d=exgcd(a,b,x,y);
27 if (c%d!=0) printf("FOREVER\n");
28 else
29 {
30 x=(x*(c/d))%p;//ax+by=c(mod p)的解
31 LL t=mabs(b/d);
32 x=(x%t+t)%t;//最小非负整数解
33 if (!x) x+=t;//为0时要调整
34 printf("%I64d\n",x);
35 }
36 }
37 return 0;
38 }

【poj 2115】C Looooops(数论--拓展欧几里德 求解同余方程 模版题)的更多相关文章

  1. 【hdu 1576】A/B(数论--拓展欧几里德 求逆元 模版题)

    题意:给出 A%9973 和 B,求(A/B)%9973的值. 解法:拓展欧几里德求逆元.由于同余的性质只有在 * 和 + 的情况下一直成立,我们要把 /B 转化为 *B-1,也就是求逆元. 对于 B ...

  2. 【poj 2891】Strange Way to Express Integers(数论--拓展欧几里德 求解同余方程组 模版题)

    题意:Elina看一本刘汝佳的书(O_O*),里面介绍了一种奇怪的方法表示一个非负整数 m .也就是有 k 对 ( ai , ri ) 可以这样表示--m%ai=ri.问 m 的最小值. 解法:拓展欧 ...

  3. 【hdu 3579】Hello Kiki(数论--拓展欧几里德 求解同余方程组)

    题意:Kiki 有 X 个硬币,已知 N 组这样的信息:X%x=Ai , X/x=Mi (x未知).问满足这些条件的最小的硬币数,也就是最小的正整数 X. 解法:转化一下题意就是 拓展欧几里德求解同余 ...

  4. 【poj 1061】青蛙的约会(数论--拓展欧几里德 求解同余方程)

    题意:已知2只青蛙的起始位置 a,b 和跳跃一次的距离 m,n,现在它们沿着一条长度为 l 的纬线(圈)向相同方向跳跃.问它们何时能相遇?(好有聊的青蛙 (΄◞ิ౪◟ิ‵) *)永不相遇就输出&quo ...

  5. POJ - 2115 C Looooops(扩展欧几里德求解模线性方程(线性同余方程))

    d.对于这个循环, for (variable = A; variable != B; variable += C) statement; 给出A,B,C,求在k位存储系统下的循环次数. 例如k=4时 ...

  6. 【hdu 1573】X问题(数论--拓展欧几里德 求解同余方程组的个数)

    题目:求在小于等于N的正整数中有多少个X满足:X mod a[0] = b[0], X mod a[1] = b[1], X mod a[2] = b[2], -, X mod a[i] = b[i] ...

  7. poj 2115 C Looooops(推公式+扩展欧几里得模板)

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

  8. 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( ...

  9. 【题解】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 ...

随机推荐

  1. (数据科学学习手札103)Python+Dash快速web应用开发——页面布局篇

    本文示例代码已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 这是我的系列教程Python+Dash快速web ...

  2. 转载 - Ubuntu源改国内源 与 批量更改ubuntu机器apt源

    change_apt_source.sh # !/bin/bash # 备份原来的源文件 cp /etc/apt/sources.list /etc/apt/sources.list.bak # 获取 ...

  3. appium元素识别方式实战

    github代码::  https://github.com/w550856163/App_Demo.git  tag: V1.1 Appium Inspector定位工具界面介绍:  Selecte ...

  4. CopyOnWriteArrayList 读写分离,弱一致性

    为什么会有CopyOnWriteArrayList? 我们知道ArrayList和LinkedList实现的List都是非线程安全的,于是就有了Vector,它是基于ArrayList的线程安全集合, ...

  5. Subline Text 3 安装

    Subline Text 3 下载 下载链接 http://www.sublimetext.com/3 ,下载Subline Text3的安装包,这里以 64位的windows10为例,如果是其他操作 ...

  6. 【Linux】sudo配置文件讲解

    一.sudo执行命令的流程 将当前用户切换到超级用户下,或切换到指定的用户下, 然后以超级用户或其指定切换到的用户身份执行命令,执行完成后,直接退回到当前用户. 具体工作过程如下: 当用户执行sudo ...

  7. Jenkins自动部署spring boot

    Jenkins自动部署spring boot 背景介绍 本公司属于微小型企业,初期业务量不高,所有程序都写在一个maven项目里面,不过是多模块开发. 分了login模块,service模块,cms模 ...

  8. linux通过ntp同步时间

    1.安装服务 yum install ntp ##安装ntp服务,这个和ntpdate不一样哦,用这个比较好 systemctl start ntpd.service ###启动服务 systemct ...

  9. (06)-Python3之--判断、循环

    1.判断(if) 语法: if 条件(True/False): 条件为真时,执行的代码(要干的事情)[elif 条件: 条件为真时,执行的代码(要干的事情)elif 条件: 条件为真时,执行的代码(要 ...

  10. Spark底层原理详细解析(深度好文,建议收藏)

    Spark简介 Apache Spark是用于大规模数据处理的统一分析引擎,基于内存计算,提高了在大数据环境下数据处理的实时性,同时保证了高容错性和高可伸缩性,允许用户将Spark部署在大量硬件之上, ...