[POJ2115]C Looooops 拓展欧几里得
这个题要找到本身的模型就行了
a+c*x=b(mod 2k) -> c*x+2k*y=b-a
求这个方程对于x,y有没有整数解.
如果没有学过,强烈建议看看我之后写的一篇博客!!
这个只要学过拓展欧几里得(好像有的叫扩展欧几里德QAQ)(求解一次整数方程的整数解)应该是能做出来的,下面简单讲讲
已知一组二元一次方程 ax+by=c(a,b为已知;x,y未知) 我们要求x和y的整数解。
这个咋做呢 首先 我们知道 gcd(a,b)=gcd(b,a%b)这个就是朴素欧几里德(辗转相除) ,又知道一个方程ax+by=gcd(a,b)必有解(通过贝祖定理可知(我也不会证明QAQ))。
这些证明见《数学一本通》或者百度搜搜。
然后我们就有 ax+by=gcd(a,b)=gcd(b, a%b)
=bx+(a%b)y
=bx+(a-[a/b]*b)y
=bx+ay-[a/b]*by
=y*a+(x-[a/b]*y)*b
最后x变成了y,y变成了x-[a/b]*y
然后就可以通过不断递归求gcd来减小a,b的范围,到b为0时就有ax+0*y=a。x显然为1,y为0。
在找到最小解之后,递归回去修改x,y。
当且仅当gcd(a,b)=1这个方程有解。
一开始对于ax+by=c这种形式的,最好先约去(a,b)的gcd,最后再给c乘回来。
这个程序最后对于sum进行了操作,这是因为要求sum的最小正整数解。
这是因为:得到两个相邻x解的间隔恰好为b(这个比较显然的吧。。QwQ),然后最小正整数的x解就为(x%b+b)了2333。(公式没用LaTeX有点丑TAT)
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#include <cctype>
#include <iostream>
#define For(i, l, r) for(int i = (l); i <= (int)(r); ++i)
#define Fordown(i, r, l) for(int i = (r); i >= (int)(l); --i)
#define Set(a, v) memset(a, v, sizeof(a))
#define LL long long using namespace std; LL extended_gcd (LL a, LL b, LL &x, LL &y) {
LL ret, tmp;
if (!b) {x = ; y = ; return a;}
ret = extended_gcd (b, a%b, x, y);
tmp = x;
x = y;
y = tmp - a / b * y;
return ret;
} int main(){
#ifndef ONLINE_JUDGE
freopen ("program.in", "r", stdin);
freopen ("program.out", "w", stdout);
#endif
LL a, b, c, k;
for(;;) {
scanf ("%lld%lld%lld%lld", &a, &b, &c, &k);
if (!a && !b && !c && !k) return ;
k = (long long) << k;
LL x, y;
LL ret = extended_gcd (c, k, x, y); //进行拓欧,求之前写的那个方程有无解
if ((b - a) % ret != ) {printf ("FOREVER\n"); continue;} //判断gcd是否为1,判断有无解
LL sum = (x * (b - a) / ret) % k; //同比扩大的倍数
sum = (sum % (k / ret) + k / ret) % (k / ret); //求sum的正整数解
cout << sum << endl;
}
}
[POJ2115]C Looooops 拓展欧几里得的更多相关文章
- poj2115 C Looooops——扩展欧几里得
题目:http://poj.org/problem?id=2115 就是扩展欧几里得呗: 然而忘记除公约数... 代码如下: #include<iostream> #include< ...
- POJ2115 C Looooops[扩展欧几里得]
C Looooops Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 24355 Accepted: 6788 Descr ...
- Looooops(求解同余方程、同余方程用法)【拓展欧几里得】
Looooops(点击) A Compiler Mystery: We are given a C-language style for loop of type for (variable = A; ...
- NOIP2012拓展欧几里得
拉板题,,,不说话 我之前是不是说过数据结构很烦,,,我想收回,,,今天开始的数论还要恶心,一早上听得头都晕了 先来一发欧几里得拓展裸 #include <cstdio> void gcd ...
- poj 1061 青蛙的约会 拓展欧几里得模板
// poj 1061 青蛙的约会 拓展欧几里得模板 // 注意进行exgcd时,保证a,b是正数,最后的答案如果是负数,要加上一个膜 #include <cstdio> #include ...
- bzoj4517: [Sdoi2016]排列计数--数学+拓展欧几里得
这道题是数学题,由题目可知,m个稳定数的取法是Cnm 然后剩下n-m本书,由于编号为i的书不能放在i位置,因此其方法数应由错排公式决定,即D(n-m) 错排公式:D[i]=(i-1)*(D[i-1]+ ...
- POJ 2891 Strange Way to Express Integers(拓展欧几里得)
Description Elina is reading a book written by Rujia Liu, which introduces a strange way to express ...
- POJ1061 青蛙的约会-拓展欧几里得
Description 两只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见一面.它们很高兴地发现它们住在同一条纬度线上,于是它们约定各自朝西跳,直到碰面为止.可是它们出发之前忘记了一件很重要的事 ...
- BZOJ-2242 计算器 快速幂+拓展欧几里得+BSGS(数论三合一)
污污污污 2242: [SDOI2011]计算器 Time Limit: 10 Sec Memory Limit: 512 MB Submit: 2312 Solved: 917 [Submit][S ...
随机推荐
- 分享一下自己写的一个vscode-leetcode答题插件
0. 前言 春节这几天每天吃吃喝喝睡睡玩玩,突然发现明天就要上班了,吓得我虎躯一震. 春节结束之后,学生党们陆续开学,相信有许多同学马上就要在春季招聘中拼杀一番.想要收获心意的offer,当然免不了对 ...
- 用es6的Array.reduce()方法计算一个字符串中每个字符出现的次数
有一道经典的字符串处理的问题,统计一个字符串中每个字符出现的次数. 用es6的Array.reduce()函数配合“...”扩展符号可以更方便的处理该问题. s='abananbaacnncn' [. ...
- Redis 持久化和配置文件
Reids 持久化 Redis提供了两种持久化的方式,分别是RDB(Redis DataBase)和AOF(Append Only File). RDB,简而言之,就是在不同的时间点,将redis ...
- 自动化测试工具selenium的使用
1.自动化测试的前提
- 老男孩Python全栈开发(92天全)视频教程 自学笔记17
day17课程内容: 装饰器回顾练习 登录功能: #登录京东,不同的页面,选择页面,然后不同的登录方式with open('作业5.1jingdong','w',encoding='utf8') as ...
- 如何使用 OpenCV 打开摄像头获取图像数据?
OpenCV 如何打开摄像头获取图像数据? 代码运行环境:Qt 5.9.1 msvc2015 32bit OpenCV 3.3.0 #include "include/opencv2/ope ...
- HDU - 1495 bfs [kuangbin带你飞]专题一
模拟倒水的过程,每次可以把第i个杯子的水向第j个杯子里面倒,这可能出现新的状态,不停的更新状态,指导某两个杯子的水等于S/2说明找到答案,如果所有状态搜索完毕仍然不能均分,则退出. 注意:如果S是奇数 ...
- 【Learning】 莫比乌斯反演
莫比乌斯反演 对于两个定义域为非负整数的函数\(F(n)\)和\(f(n)\) 若满足:\(F(n)=\sum\limits_{d|n}f(d)\),则反演得到\(f(n)=\sum\limi ...
- python小练习之读取文件写入excel
文件是个json文件 内容为: 导入excel后的格式为 屡一下思路 一步步怎么实现: 1 首先需要读取json文件 然后将读取的内容转为字典 2 将excel的列名写入一个list中 然后遍历执行写 ...
- Wireshark理解TCP乱序重组和HTTP解析渲染
TCP数据传输过程 TCP乱序重组原理 HTTP解析渲染 TCP乱序重组 TCP具有乱序重组的功能.(1)TCP具有缓冲区(2)TCP报文具有序列号所以,对于你说的问题,一种常见的处理方式是:TCP会 ...