Looooops(求解同余方程、同余方程用法)【拓展欧几里得】
Looooops(点击)
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 which starts by setting variable to value A and while variable is not equal to B, repeats statement followed by increasing the variable by C. We want to know how many times does the statement get executed for particular values of A, B and C, assuming that all arithmetics is calculated in a k-bit unsigned integer type (with values 0 <= x < 2 k) modulo 2 k.
Input
The input consists of several instances. Each instance is described by a single line with four integers A, B, C, k separated by a single space. The integer k (1 <= k <= 32) is the number of bits of the control variable of the loop and A, B, C (0 <= A, B, C < 2 k) are the parameters of the loop. 
The input is finished by a line containing four zeros.
Output
The output consists of several lines corresponding to the instances on the input. The i-th line contains either the number of executions of the statement in the i-th instance (a single integer number) or the word FOREVER if the loop does not terminate.
Sample Input
3 3 2 16
3 7 2 16
7 3 2 16
3 4 2 16
0 0 0 0
Sample Output
0
2
32766
FOREVER思路:
题目搁了两天,开始想了个很复杂的方法,花了好长时间调试结果TLE
后来实在没办法去搜了一下,才知道是用同余方程 解决
根据题目可以列出一个方程式,将加c的次数设成x:
∵ a+cx≡b(%mod);
∴ a+c*x+mod*y=b;
∴ c*x+mod*y=b-a;
根据exgcd可以求解 同时好要求出最小整数x的解就是结果
代码:
#include<stdio.h>
typedef long long LL;
LL GCD;
LL exgcd(LL a,LL b,LL &x,LL &y)  // 拓展欧几里得求x、y特解
{
    if(!b){
        x=1;y=0;return a;
    }
    GCD=exgcd(b,a%b,y,x);
    y-=a/b*x;
    return GCD;
}
LL qpow(LL c,LL  q)     // 快速幂 因为题目涉及求2^k 如果用pow可能会出错
{
    LL ans=1;             //快速幂里面不需要%mod 和mod没有关系  不需要担心快速幂结果会超过2^k
    while(q){
        if(q%2){
            ans*=c;
        }
        c*=c;
        q/=2;
    }
    return ans;
}
int main()
{
    LL a,b,c,k,x,y,t;
    while(scanf("%lld%lld%lld%lld",&a,&b,&c,&k)!=EOF){
        if(a==0&&b==0&&c==0&&k==0){
            break;
        }
        else{
            GCD=exgcd(c,qpow(2,k),x,y);  //将 c、mod=2^k、x、y 依次带入拓展欧几里得方程求解
            if((b-a)%GCD){
                printf("FOREVER\n");   // 判断方程是否有解
            }
            else{
                x*=((b-a)/GCD);        //类似求解ax+by=c最小整数解的方法 得出最小x的值
                t=qpow(2,k)/GCD;  //因为求x所以t=b/GCD 但这个b并不是输入的b 而是 方程里面对应
                if(t<0){              的b 即 qpow(2,k)
                    t=-t;
                }
                x=(x%t+t)%t;
                printf("%lld\n",x);      //输出结果x
            }
        }
    }
    return 0;
}
Looooops(求解同余方程、同余方程用法)【拓展欧几里得】的更多相关文章
- 【lydsy1407】拓展欧几里得求解不定方程+同余方程
		题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1407 题意: 有n个野人,野人各自住在第c[i]个山洞中(山洞成环状),每年向前走p[i] ... 
- [POJ2115]C Looooops  拓展欧几里得
		原题入口 这个题要找到本身的模型就行了 a+c*x=b(mod 2k) -> c*x+2k*y=b-a 求这个方程对于x,y有没有整数解. 这个只要学过拓展欧几里得(好像有的叫扩展欧几里德QA ... 
- ACM数论-欧几里得与拓展欧几里得
		ACM数论——欧几里得与拓展欧几里得 欧几里得算法: 欧几里德算法又称辗转相除法,用于计算两个整数a,b的最大公约数. 基本算法:设a=qb+r,其中a,b,q,r都是整数,则gcd(a,b)=gcd ... 
- Vulnerable Kerbals CodeForces - 772C【拓展欧几里得建图+DAG上求最长路】
		根据拓展欧几里得对于同余方程 $ax+by=c$ ,有解的条件是 $(a,b)|c$. 那么对于构造的序列的数,前一个数 $a$ 和后一个数 $b$ ,应该满足 $a*x=b(mod m)$ 即 $ ... 
- HDU-3579-Hello Kiki (利用拓展欧几里得求同余方程组)
		设 ans 为满足前 n - 1个同余方程的解,lcm是前n - 1个同余方程模的最小公倍数,求前n个同余方程组的解的过程如下: ①设lcm * x + ans为前n个同余方程组的解,lcm * x ... 
- POJ 2891 Strange Way to Express Integers(拓展欧几里得)
		Description Elina is reading a book written by Rujia Liu, which introduces a strange way to express ... 
- BZOJ-1407   Savage    枚举+拓展欧几里得(+中国剩余定理??)
		zky学长实力ACM赛制测试,和 大新闻(YveH) 和 华莱士(hjxcpg) 组队...2h 10T,开始 分工我搞A,大新闻B,华莱士C,于是开搞: 然而第一题巨鬼畜,想了40min发现似乎不可 ... 
- [zoj 3774]Power of Fibonacci 数论(二次剩余 拓展欧几里得 等比数列求和)
		Power of Fibonacci Time Limit: 5 Seconds Memory Limit: 65536 KB In mathematics, Fibonacci numbe ... 
- 51 Nod 1256 乘法逆元(数论:拓展欧几里得)
		1256 乘法逆元 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 收藏 关注 给出2个数M和N(M < N),且M与N互质,找出一个数K满足0 < K ... 
随机推荐
- springboot使用redis的keyspace notifications 实现定时通知
			简单定时任务解决方案:使用redis的keyspace notifications(键失效后通知事件) 需要注意此功能是在redis 2.8版本以后推出的,因此你服务器上的reids最少要是2.8版本 ... 
- python脚本实现接口自动化轻松搞定上千条接口用例
			接口自动化目前是测试圈主流的一个话题,我也在网上搜索了很多关于自动化的关键词,大多数博主分享的python做接口自动化都是以开源的框架,比如:pytest.unittest+ddt(数据驱动) 最常见 ... 
- 新来的老大,剑走偏锋,干掉AOP做操作日志,实现后我们都惊呆了
			前言 用户在操作我们系统的过程中,针对一些重要的业务数据进行增删改查的时候,我们希望记录一下用户的操作行为,以便发生问题时能及时的找到依据,这种日志就是业务系统的操作日志. 本篇我们来探讨下常见操作日 ... 
- 不可不知的辅助测试的Fiddler小技巧
			在以前的博文中,时常有分享Fiddler的一些使用技巧,今天再贴下. Fiddler抓包工具使用详解 利用Fiddler拦截接口请求并篡改数据 Fiddler使用过程中容易忽略的小技巧 Mock测试, ... 
- Weblogic 漏洞利用总结
			整理的一些利用方式,后续会更新到15年至今的洞 后台爆破拿shell 后台爆破: 部署-安装-上载文件 制作war包,一直下一步,最好保存 jar -cvf shell.war ./shll/* 上传 ... 
- 小谢第7问:js前端如何实现大文件分片上传、上传进度、终止上传以及删除服务器文件?
			文件上传一般有两种方式:文件流上传和base64方式上传,毫无疑问,当进行大文件上传时候,转为base64是不现实的,因此用formData方式结合文件流,直接上传到服务器 本文主要结合vue的来讲解 ... 
- jchdl - RTL实例 - And2And(结构体嵌套的使用)
			https://mp.weixin.qq.com/s/PQIPkDymvcGc_re8ux50vA 结构体可以嵌套使用. 参考链接 https://github.com/wjcdx/jchdl ... 
- meta个人学习纪录
			< meta > 元素 元素可提供相关页面的元信息(meta-information),比如针对搜索引擎和更新频度的描述和关键词. 标签位于文档的头部,不包含任何内容. 标签的属性定义了与 ... 
- JavaSE (六)面向对象 -- 类的结构
			个人博客网:https://wushaopei.github.io/ (你想要这里多有) 目录 一.属性(变量) 1.变量的分类: 二.方法 1.例子: 2.格式: 3.方法的说明: 4.ret ... 
- Android中如何使用GridView
			首先在主XML中放入Grid View控件 取好id private GridView gv1; private int[] icon = {R.drawable.cat, R.drawable.co ... 
