POJ 2891 Strange Way to Express Integers 中国剩余定理 数论 exgcd
http://poj.org/problem?id=2891
题意就是孙子算经里那个定理的基础描述不过换了数字和约束条件的个数……
https://blog.csdn.net/HownoneHe/article/details/52186204
这个博客提供了互质情况下的代码以及由此递推出的(另一个版本的)非互质情况下的代码。
假如给出m[n],a[n]分别代表要求的除数和余数:
互质情况下:
( 做n次 ) 对不包含m[i]的所有m求积 ( 互质的数的最小公倍数 ) , exgcd求出来逆元后*a[i], 然后对这n个结果求和取模.
设M为不包含m[i]的所有m的积,
那么 (M*x)%m[i]=1 --> (M*x)=1+m[i]*y --> (M*x)-m[i]*y=1
exgcd后的M*x就是单位1 ( 逆元 ) 了.
非互质情况下:
M被分解质因子,重复质因子的指数都变为1(最小公倍数),然后做同样操作。
我这里写的是一个相对优化的代码(博客中的第二个版本),使用的空间更小,求最小公倍数更加方便,也更不容易过程中溢出,嗯读一下代码应该就明白了。
我总觉得我以前写过中国剩余定理啊为什么现在这么详细解释……
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#define LL long long
const LL maxn=;
LL n;
void exgcd(LL a,LL b,LL &d,LL &x,LL &y){
if(!b){
x=;y=;d=a;
return;
}exgcd(b,a%b,d,x,y);
LL z=x;x=y;
y=z-(LL)(a/b)*y;
}
int main(){
while(~scanf("%lld",&n)){
LL mc=,ac=,m1=,a1=,f=;
for(int i=;i<=n;i++){
scanf("%lld%lld",&m1,&a1);
if(f)continue;
if(i==){mc=m1;ac=a1;continue;}
LL x,y,d,c=a1-ac; exgcd(mc,m1,d,x,y);
if(c%d){f=;continue;}
x=(((x*(c/d))%m1)+m1)%m1;
ac+=mc*x;
mc=mc/d*m1;
ac=ac%mc;
}
if(f)printf("-1\n");
else printf("%lld\n",ac);
}
}
POJ 2891 Strange Way to Express Integers 中国剩余定理 数论 exgcd的更多相关文章
- POJ 2891 Strange Way to Express Integers 中国剩余定理解法
一种不断迭代,求新的求余方程的方法运用中国剩余定理. 总的来说,假设对方程操作.和这个定理的数学思想运用的不多的话.是非常困难的. 參照了这个博客的程序写的: http://scturtle.is-p ...
- POJ 2891 Strange Way to Express Integers(中国剩余定理)
题目链接 虽然我不懂... #include <cstdio> #include <cstring> #include <map> #include <cma ...
- poj 2981 Strange Way to Express Integers (中国剩余定理不互质)
http://poj.org/problem?id=2891 Strange Way to Express Integers Time Limit: 1000MS Memory Limit: 13 ...
- poj 2891 Strange Way to Express Integers (非互质的中国剩余定理)
Strange Way to Express Integers Time Limit: 1000MS Memory Limit: 131072K Total Submissions: 9472 ...
- poj——2891 Strange Way to Express Integers
Strange Way to Express Integers Time Limit: 1000MS Memory Limit: 131072K Total Submissions: 16839 ...
- [POJ 2891] Strange Way to Express Integers
Strange Way to Express Integers Time Limit: 1000MS Memory Limit: 131072K Total Submissions: 10907 ...
- poj 2891 Strange Way to Express Integers(中国剩余定理)
http://poj.org/problem?id=2891 题意:求解一个数x使得 x%8 = 7,x%11 = 9; 若x存在,输出最小整数解.否则输出-1: ps: 思路:这不是简单的中国剩余定 ...
- [poj 2891] Strange Way to Express Integers 解题报告(excrt扩展中国剩余定理)
题目链接:http://poj.org/problem?id=2891 题目大意: 求解同余方程组,不保证模数互质 题解: 扩展中国剩余定理板子题 #include<algorithm> ...
- poj 2891 Strange Way to Express Integers【扩展中国剩余定理】
扩展中国剩余定理板子 #include<iostream> #include<cstdio> using namespace std; const int N=100005; ...
随机推荐
- 谈谈Linux内核驱动的coding style【转】
转自:http://www.cnblogs.com/wwang/archive/2011/02/24/1960283.html 最近在向Linux内核提交一些驱动程序,在提交的过程中,发现自己的代码离 ...
- Web测试技术要领
基于Web的系统测试与传统的软件测试既有相同之处,也有不同的地方,对软件测试提出了新的挑战.基于Web的系统测试不但需要检查和验证是否按照设计的要求运行,而且还要评价系统在不同用户的浏览器端的显示是否 ...
- redis从入门到放弃 -> 简介&概念
一.redis简介 Redis是一款开源的.高性能的键-值存储.它常被称作是一款数据结构服务器. 当值支持的主要数据类型为:字符串(strings)类型,括哈希(hashes).列表(lists).集 ...
- No.9 selenium学习之路之CSS定位
CSS定位方式: 元素中间加“.”表示是class 1.通过ID定位 driver.find_element_by_css_selector("#ID值") 2.通过class定位 ...
- JMeter接口&性能测试
JMeter接口测试 目前最新版本发展到5.0版本,需要Java7以上版本环境,下载解压目录后,进入\apache-jmeter-5.0\bin\,双击ApacheJMeter.jar文件启动JMem ...
- gcc/g++ 命令
gcc & g++现在是gnu中最主要和最流行的c & c++编译器 .g++是c++的命令,以.cpp为主,对于c语言后缀名一般为.c.这时候命令换做gcc即可.其实是无关紧要的.其 ...
- Java MongoDB : Save image example
In this tutorial, we show you how to save an image file into MongoDB, via GridFS API. The GridFS API ...
- C#基础系列 - 反射基础
反射用于在程序运行过程中,获取类里面的信息或发现程序集并运行的一个过程.通过反射可以获得.dll和.exe后缀的程序集里面的信息.使用反射可以看到一个程序集内部的类,接口,字段,属性,方法,特性等信息 ...
- 容器计划任务大坑:在alpine容器里,想用非root帐号执行crontab任务
我只能说抱歉,我前前后后测试了七天, 将自己预想的配置错误,一个一个去验证. 非root帐号在alpine容器里执行crontab任务,还是失败, 输出依旧是一片空白~ stackoverflow里, ...
- HBase(六)HBase整合Hive,数据的备份与MR操作HBase
一.数据的备份与恢复 1. 备份 停止 HBase 服务后,使用 distcp 命令运行 MapReduce 任务进行备份,将数据备份到另一个地方,可以是同一个集群,也可以是专用的备份集群. 即,把数 ...