设 ans 为满足前 n - 1个同余方程的解,lcm是前n - 1个同余方程模的最小公倍数,求前n个同余方程组的解的过程如下:

①设lcm * x + ans为前n个同余方程组的解,lcm * x + ans一定能满足前n - 1个同余方程;

②第 n 个同余方程可以转化为a[n] * y + b;

合并①②得:lcm * x + ans = a[n] * y + b; => lcm * x - a[n] * y = b - ans(可以用拓展欧几里得求解x和y)

但是拓展欧几里得要求取余的数是正数,我们可以转化上面的方程为lcm * x + a[n] * -y = b - ans(后面我们用x得到解,所以不关心y的正负)

解得一组x和y;

x += k * (a[n] / gcd);(k为任意整数)

我们可以求得最小非负数x,在带入①得到前n个同余方程的最小非负数解;

代码如下:

Accepted 3579 15MS 1368K 1112 B G++
#include "bits/stdc++.h"
using namespace std;
int a[], b[];
// 拓展欧几里得C++模板
int ex_gcd(int a, int b, int &x, int &y) {
if (b == ) {
x = ;
y = ;
return a;
}
int ans = ex_gcd(b, a % b, y, x);
y -= a / b * x;
return ans;
}
int solve(int n) {
// 任何数对1取余都是0,所以初始化ans = 0, lcm = 1;
int x, y, ans = , lcm = ;
for (int i = ; i < n; i++) {
int gcd = ex_gcd(lcm, a[i], x, y);
if ((b[i] - ans) % gcd) {
return -;
}
// 拓展欧几里得求得的x和y是对于gcd而言的。乘完之后才是对于 (b[i] - ans) 的 x
x *= (b[i] - ans) / gcd;
a[i] /= gcd;
// 使 x 成为最小非负数解
x = (x % a[i] + a[i]) % a[i];
// 更新ans
ans += x * lcm;
// 更新lcm
lcm *= a[i];
}
// 本题要求最小正整数解,如果ans是0,要加一个最小公倍数也就是lcm
return ans ? ans : lcm;
}
int main() {
int t, n, ca = ;
scanf("%d", &t);
while (t--) {
scanf("%d", &n);
for (int i = ; i < n; i++) {
scanf("%d", &a[i]);
}
for (int i = ; i < n; i++) {
scanf("%d", &b[i]);
}
printf("Case %d: %d\n", ca++, solve(n));
}
return ;
}

HDU-3579-Hello Kiki (利用拓展欧几里得求同余方程组)的更多相关文章

  1. 【hdu3579-Hello Kiki】拓展欧几里得-同余方程组

    http://acm.hdu.edu.cn/showproblem.php?pid=3579 题解:同余方程组的裸题.注意输出是最小的正整数,不包括0. #include<cstdio> ...

  2. 【poj2891-Strange Way to Express Integers】拓展欧几里得-同余方程组

    http://poj.org/problem?id=2891 题意:与中国剩余定理不同,p%ai=bi,此处的ai(i=1 2 3 ……)是不一定互质的,所以要用到的是同余方程组,在网上看到有人称为拓 ...

  3. 【hdu1573-X问题】拓展欧几里得-同余方程组

    http://acm.hdu.edu.cn/showproblem.php?pid=1573 求小于等于N的正整数中有多少个X满足: X mod a0 = b0 X mod a1 = b1 …… X  ...

  4. hdu 1576 A/B(拓展欧几里得)

    A/B Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...

  5. POJ 2891 Strange Way to Express Integers(拓展欧几里得)

    Description Elina is reading a book written by Rujia Liu, which introduces a strange way to express ...

  6. ZOJ Problem Set - 3593 拓展欧几里得 数学

    ZOJ Problem Set - 3593 http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3593 One Person ...

  7. BZOJ-1407 Savage 枚举+拓展欧几里得(+中国剩余定理??)

    zky学长实力ACM赛制测试,和 大新闻(YveH) 和 华莱士(hjxcpg) 组队...2h 10T,开始 分工我搞A,大新闻B,华莱士C,于是开搞: 然而第一题巨鬼畜,想了40min发现似乎不可 ...

  8. 【lydsy1407】拓展欧几里得求解不定方程+同余方程

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1407 题意: 有n个野人,野人各自住在第c[i]个山洞中(山洞成环状),每年向前走p[i] ...

  9. NOIP2012拓展欧几里得

    拉板题,,,不说话 我之前是不是说过数据结构很烦,,,我想收回,,,今天开始的数论还要恶心,一早上听得头都晕了 先来一发欧几里得拓展裸 #include <cstdio> void gcd ...

随机推荐

  1. Redis_大保健

    Redis redis命令参考网址: http://doc.redisfans.com/ redis主从: 集群:一组通过网络连接的计算机,共同对外提供服务,像一个独立的服务器. 一.简介 nosql ...

  2. java.sql.BatchUpdateException: ORA-01691: Lob 段 CSASSSMBI.SYS_LOB0000076987C00003$$ 无法通过 128 (在表空间 HRDL_CSASS 中) 扩展

    问题: 在tomcat日志信息中出现:java.sql.BatchUpdateException: ORA-01691: Lob 段 CSASSSMBI.SYS_LOB0000076987C00003 ...

  3. 14)载入png图片

    1)之前在窗口中载入图片  一般都是bmp的  但是  我想从网上下一些图片,这些图片可能是png的 2)那么就有了下面的操作 3)png图片可以直接做成透明的. 4)首先是创建窗口的基本代码: #i ...

  4. 吴裕雄--天生自然 PHP开发学习:MySQL 读取数据

    <?php $servername = "localhost"; $username = "root"; $password = "admin& ...

  5. mybatis 在自动生成时设置不生成Example类

    只需要在配置要生成的table表中添加几个配置属性就行了. 在generatorConfig.xml文件中修改 <!--指定数据库表--> <table tableName=&quo ...

  6. one_day_one_linuxCmd---scp命令

    <坚持每天学习一个 linux 命令,今天我们来学习 scp 命令> scp 命令主要用在不同的 linux 系统之间 copy 文件,基于 ssh 登录,是一种安全的复制 scp 命令的 ...

  7. windows支持apache、mysql、php集成环境推荐wampserver3.2 64位版本

    对英文不感冒的同学很容易下载到更新包,而且官方的下载速度很慢,此文件为官方原版下载,现在分享给大家. 链接:https://pan.baidu.com/s/1LYyJi6FddvkQQNrLp4L6W ...

  8. 别了JetBrains,换Visual Studio

    Visual Studio一直是我排斥的,这么多年一致不用. 2019年JetBrains的注册码越来越频繁的被封杀,我承认使用盗版不对. 试过Eclipse+pydev搞python,但是todo用 ...

  9. 线性齐次递推式快速求第n项 学习笔记

    定义 若数列 \(\{a_i\}\) 满足 \(a_n=\sum_{i=1}^kf_i \times a_{n-i}\) ,则该数列为 k 阶齐次线性递推数列 可以利用多项式的知识做到 \(O(k\l ...

  10. linux复制指定文件

    find /somedir -type f|xargs -I {} cp {} . find /somedir -name "*.txt"|xargs -I {} cp {} .