这道题就是扩展的中国剩余定理(模数不互质)

首先我们回忆一下中国剩余定理对于给定n个方程组x≡ai(mod pi)

令m=∏pi wi=m/pi,然后求解关于hi,ri的方程wi*hi+pi*ri=1

令ei=wi*hi,则x≡∑eiai (mod m) 简单的验证一下,拿每个pi去模x,

因为除了wi意外,其他wj都是pi的倍数,很容易发现是复合条件的

但是当pi不互质时,上述就失效了,所以我们不能再用中国剩余定理

我们就觉得办法是用增量法,假设现在已经得到满足前k个同余方程的最小解ans

对于下一个方程x≡a(mod p),

我们不难想到满足单一同余方程的解x=a+p*k,满足前k个同余方程的解x=ans+lcm(pi)*k

现在我们只要令a+p*k=ans+lcm(pi)*k',找到这个二元一次方程的解

就能找到满足前k+1个同余方程的最小解,显然这是用扩展欧几里得解决

注意这道题说输入和输出可以用int64表示,但很容易中间量爆int64,理论用高精度

实际全部用long long好像就能过了(注意discuss中部分数据会造成中间量爆int64,但可以忽视……)

 #include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<stdlib.h>
#define ll long long
using namespace std;
int k;
ll a1,a2,p1,p2,x,y; ll gcd(ll a,ll b)
{
return (b==)?a:gcd(b,a%b);
}
void exgcd(ll a,ll b,ll &x,ll &y)
{
if (b==) {x=; y=; return;}
exgcd(b,a%b,x,y);
ll xx=x,yy=y;
x=yy; y=xx-(a/b)*yy;
} int main()
{
while (scanf("%d",&k)!=EOF)
{
scanf("%lld%lld",&p1,&a1);
a1%=p1;
bool ch=;
for (int i=; i<=k; i++)
{
scanf("%lld%lld",&p2,&a2);
if (ch) continue;
a2%=p2;
ll g=gcd(p1,p2);
if ((a1-a2)%g)
{
ch=;
continue;
}
ll a=p1/g,c=(a1-a2)/g;
exgcd(a,p2/g,x,y); y=(y+a)%a;
y=(y*c%a+a)%a;
p1=p1*(p2/g); a1=(a2+p2*y%p1)%p1;
}
if (ch) puts("-1");
else printf("%lld\n",a1);
}
system("pause");
return ;
}

poj2891的更多相关文章

  1. 【poj2891】 Strange Way to Express Integers

    http://poj.org/problem?id=2891 (题目链接) 题意 求解线性同余方程组,不保证模数一定两两互质. Solotion 一般模线性方程组的求解,详情请见:中国剩余定理 细节 ...

  2. POJ2891——Strange Way to Express Integers(模线性方程组)

    Strange Way to Express Integers DescriptionElina is reading a book written by Rujia Liu, which intro ...

  3. 【poj2891】同余方程组

    同余方程组 例题1:pku2891Strange Way to Express Integers 中国剩余定理求的同余方程组mod 的数是两两互素的.然而本题(一般情况,也包括两两互素的情况,所以中国 ...

  4. P4777 【模板】扩展中国剩余定理(EXCRT)/ poj2891 Strange Way to Express Integers

    P4777 [模板]扩展中国剩余定理(EXCRT) excrt模板 我们知道,crt无法处理模数不两两互质的情况 然鹅excrt可以 设当前解到第 i 个方程 设$M=\prod_{j=1}^{i-1 ...

  5. POJ2891 Strange Way to Express Integers 扩展欧几里德 中国剩余定理

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - POJ2891 题意概括 给出k个同余方程组:x mod ai = ri.求x的最小正值.如果不存在这样的x, ...

  6. 【POJ2891】Strange Way to Express Integers(拓展CRT)

    [POJ2891]Strange Way to Express Integers(拓展CRT) 题面 Vjudge 板子题. 题解 拓展\(CRT\)模板题. #include<iostream ...

  7. 中国剩余定理+扩展中国剩余定理 讲解+例题(HDU1370 Biorhythms + POJ2891 Strange Way to Express Integers)

    0.引子 每一个讲中国剩余定理的人,都会从孙子的一道例题讲起 有物不知其数,三三数之剩二,五五数之剩三,七七数之剩二.问物几何? 1.中国剩余定理 引子里的例题实际上是求一个最小的x满足 关键是,其中 ...

  8. poj2891 拓展欧几里得

    //Accepted 164 KB 16 ms //拓展欧几里得 //m=a1*x+b1 --(1) //m=a2*(-y)+b2 --(2) //->a1*x+a2*y=b2-b1 //由欧几 ...

  9. 【poj2891】Strange Way to Express Integers

    题意: 给出n个模方程x=a(mod r) 求x的最小解 题解: 这就是个线性模方程组的模版题- - 但是有一些要注意的地方 extgcd算出来的解x可能负数  要让x=(x%mo+mo)%mo 而且 ...

随机推荐

  1. Hadoop分布式配置

    本作品由Man_华创作,采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可.基于http://www.cnblogs.com/manhua/上的作品创作. 请先参照Linux安 ...

  2. Nginx负载均衡介绍

    Nginx真心牛逼 nginx不单可以作为强大的web服务器,也可以作为一个反向代理服务器,而且nginx还可以按照调度规则实现动态.静态页面的分离,可以按照轮询.ip哈希.URL哈希.权重等多种方式 ...

  3. Javascript 性能优化的一点技巧

    把优秀的编程方式当成一种习惯,融入到日常的编程当中.下图是今天想到的一点Javascript 性能优化的技巧,分享一下,抛砖引玉.

  4. linux 上传/下载文件到windows工具

    一般来说,linux服务器大多是通过ssh客户端来进行远程的登陆和管理的,使用ssh登陆linux主机以后,如何能够快速的和本地机器进行文件的交互呢,也就是上传和下载文件到服务器和本地:   与ssh ...

  5. [译]如何使用 Docker 组件开发 Django 项目?

    原文地址:Django Development With Docker Compose and Machine 以下为译文 Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包 ...

  6. LA 2031

    Mr. White, a fat man, now is crazy about a game named ``Dance, Dance, Revolution". But his danc ...

  7. Mime Types

    Mime Types 1.http://www.freeformatter.com/mime-types-list.html 2.http://www.webmaster-toolkit.com/mi ...

  8. js中几个正则表达式相关函数使用时g标志的作用

    首先,javascript中涉及到正则表达式的函数总共有6个,可分为两种: 1.第一种是作为字符串对象的方法,即以 String.fun(); 形式调用,这里包括 split.search.match ...

  9. hdu1715

    http://acm.hdu.edu.cn/showproblem.php?pid=1715 模板大数: #include <stdio.h> #include <string.h& ...

  10. Shell练习 行列转换

    原题:https://leetcode.com/problems/transpose-file/Given a text file file.txt, transpose its content. Y ...