caioj 1154 同余方程(模版)
求x的最小正整数解,使得ax=b(mod m)
那么显然ax - b = m * y
ax - my = b
那么就套入Ax+By = K的不定方程中,然后用exgcd求解即可
但这道题求最大正整数解,对于一组解,有这样一个推论
x = x0 +k*(b/gcd(a,b))
y = y0-k*(a/gcd(a,b))
k为任意正整数 可以带入方程中算一下,依然满足方程。
那么也就是说x的变化幅度为b / gcd(a,b)
令d = gcd(a,b), B = b
那么最小正整数解就是 (x * (K / d)) % (B/d) + (B/d)) % (B/d)
x * (K / d)是一个解,然后模掉(B/d),也就是变成和0最近的解
如果是负数,再加上一个(B/d)就整数,然后再模一个(B/d)不会改变值
如果是整数,加上(B/d)再模(B/d)也不会改变值。
所以这样求出来的就是最小正整数解。
最后数论尽量用long long 保险一些,反正一般不开数组,只是开变量,不会耗很多空间,不开白不开。
#include<cstdio>
#include<cctype>
#define REP(i, a, b) for(int i = (a); i < (b); i++)
#define _for(i, a, b) for(int i = (a); i <= (b); i++)
using namespace std;
typedef long long ll;
void read(ll& x)
{
int f = 1; x = 0; char ch = getchar();
while(!isdigit(ch)) { if(ch == '-') f = -1; ch = getchar(); }
while(isdigit(ch)) { x = x * 10 + ch - '0'; ch = getchar(); }
x *= f;
}
void exgcd(ll a, ll b, ll& d, ll& x, ll& y)
{
if(!b) { d = a; x = 1; y = 0; }
else { exgcd(b, a % b, d, y, x); y -= x * (a / b); }
}
int main()
{
ll a, b, m, x, y, d;
read(a); read(b); read(m);
ll A = a, B = -m, K = b;
exgcd(A, B, d, x, y);
if(K % d != 0) puts("no solution!");
else printf("%lld", ((x * (K / d)) % (B/d) + (B/d)) % (B/d));
return 0;
}
caioj 1154 同余方程(模版)的更多相关文章
- caioj 1155 同余方程组(模版)
第一步,和同余方程一样,转化一下 两式相减得 这就转化为了求不定方程,用exgcd 求出x,要化成最小正整数解,避免溢出 然后可以求出P出来. 这个时候要把前两个式子转化成一个式子 设求出来的是P' ...
- 【poj 2115】C Looooops(数论--拓展欧几里德 求解同余方程 模版题)
题意:有一个在k位无符号整数下的模型:for (variable = A; variable != B; variable += C) statement; 问循环的次数,若"永不停息&q ...
- 【hdu 1576】A/B(数论--拓展欧几里德 求逆元 模版题)
题意:给出 A%9973 和 B,求(A/B)%9973的值. 解法:拓展欧几里德求逆元.由于同余的性质只有在 * 和 + 的情况下一直成立,我们要把 /B 转化为 *B-1,也就是求逆元. 对于 B ...
- Hash大法
内容参考<算法竞赛进阶指南> 之前集训的时候听老师讲过,字符串题目中,hash一般不是正解,但是是一个优秀的暴力,可以拿比较多的部分分. hash涉及内容很多,这里只讨论字符串hash 可 ...
- caioj 1236 最近公共祖先 树倍增算法模版 倍增
[题目链接:http://caioj.cn/problem.php?id=1236][40eebe4d] 代码:(时间复杂度:nlogn) #include <iostream> #inc ...
- 【poj 2891】Strange Way to Express Integers(数论--拓展欧几里德 求解同余方程组 模版题)
题意:Elina看一本刘汝佳的书(O_O*),里面介绍了一种奇怪的方法表示一个非负整数 m .也就是有 k 对 ( ai , ri ) 可以这样表示--m%ai=ri.问 m 的最小值. 解法:拓展欧 ...
- Luogu P1082 同余方程(exgcd模版)
传送门 求ax%b = 1,即ax - by = 1: 很明显这是一个exgcd的形式. 那么要做这道题,首先需要gcd和exgcd的算法作铺垫. gcd(辗转相膜法): int gcd(int a, ...
- codevs 1200:同余方程
题目描述 Description 求关于 x 同余方程 ax ≡ 1 (mod b)的最小正整数解. 输入描述 Input Description 输入只有一行,包含两个正整数 a, b,用 一个 空 ...
- 创建ABPboilerplate模版项目
本文是根据角落的白板报的<通过ABPboilerplate模版创建项目>一文的学习总结,感谢原文作者角落的白板报. 1 准备 开发环境: Visual Studio 2015 update ...
随机推荐
- 为什么密信MeSince采用S/MIME加密?
S/MIME是Secure/Multipurpose Internet Mail Extensions (安全多用途互联网邮件扩展协议)的缩写,是采用PKI技术的用数字证书给邮件主题签名和加密的国标标 ...
- 使用json_decode无法解析json
在接入合作方接口时,遇到一个json无法解析出来代码如下: <?php $res='{"resultcode":007,"resMsg":"!& ...
- sort函数用法详解
用于C++中,对给定区间所有元素进行排序.头文件是#include <algorithm> sort函数进行快速排序,时间复杂度为n*log2n,比冒泡之类的要省时不少 Sort函数使用模 ...
- Could not find result map java.util.HashMap
Could not find result map java.util.HashMap 找不到结果图java.util.HashMap MyBatis 找不到返回的 'resultMap'!把resu ...
- keil5下载程序时出现“internal command error”解决方法
今天下载的时候,插入下载器,查看Debug可用看到“internal command error”,一直找不到原因,后来查看上一个工程才发现,上一个程序禁用了Seral Wire 引脚,导致的. 解决 ...
- 【codeforces 630E】A rectangle
[题目链接]:http://codeforces.com/problemset/problem/630/E [题意] 给你一个矩形的区域; 然后让你统计这个矩形区域内,有多少个正六边形. [题解] 规 ...
- Image Processing for Very Large Images
The key idea here is the partial image descriptor VIPS(VASARI Image Processing System) 是近几年逐渐兴起的针对大图 ...
- 在Windows系统下搭建Redis集群
准备工作 需要4个部件:Redis.Ruby语言运行环境.Redis的Ruby驱动redis-xxxx.gem.创建Redis集群的工具redis-trib.rb.使用redis-trib.rb工具来 ...
- HDU 4310 Contest 2
贪心,注意排序条件. #include <iostream> #include <cstdio> #include <algorithm> using namesp ...
- [React] Unit test a React Render Prop component
In this lesson, I use Enzyme and Jest to unit test a Counter Render Prop component. Writing integrat ...