解一元同余方程组

2016.1.26


试题描述

给定n个一次同余方程x mod mi=ai,这里i=0,1,2,……,n-1,给定数据保证所有的mi两两互素。求该方程组的解。


输入

第一行包含一个正整数n,接下来的n行,每行包括两个整数,对应一个同余方程,第一个数为mi,第二个数为ai,两数间用一个空格分隔。

输出

一个数,表示方程组的解。

输入示例

3
3 2
5 3
7 2

输出示例

23

其他说明

数据范围:所有给定的数据均在int32范围内,且保证所有的数据都符合题目描述的要求,结果在long long范围内。

中国剩菜定理嘛ヾ(o?∀?)?

#include<iostream>
using namespace std;
int m[101],a[101];

void exgcd(int a,int b,int &x,int &y)
{
    if(!b)
    {
        x=1;
        y=0;
        return;
    }
    exgcd(b,a%b,y,x);
    y=y-a/b*x;
}

int main()
{
    long long total=1,ans=0;
    int n;
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        scanf("%d%d",&m[i],&a[i]);
        total*=m[i];
    }
    for(int i=1;i<=n;i++)
    {
        int M=total/m[i];
        int x,y;
        exgcd(M,m[i],x,y);
        ans=(ans+a[i]*M*x)%total;
    }
    printf("%d",(ans+total)%total);

}

时间: 2024-10-08 09:22:54

解一元同余方程组的相关文章

解线性同余方程组

想必学完exgcd的各位dalao们都已经明白如何求解同余方程了 今天本蒟蒻只是想讲讲线性同余方程组的解法供各位大佬批评指错 我们现在有一些线性同余方程 X=b1 (mod a1) X=b2 (mod a2) ... X=bn (mod an) 对于前面第一个方程,我们可以用exgcd求出一个X满足一式 不妨设X=a1*y1+b1 若存在X满足二式,则a1*y1+b1=b2 (mod a2) 所以y1=(b2-b1)/a1 (mod a2) 该式有解当且仅当(b2-b1)|gcd(a1,a2)

数论之拓展欧几里得求解不定方程和同余方程组(一)

今天接到scy的压缩包,开始做数论专题.那今天就总结一下拓展欧几里得求解不定方程和同余方程组. 首先我们复习一下欧几里得算法: 1 int gcd(int a,int b){ 2 if(b==0) return a; 3 return gcd(b,a%b);4 } 拓展欧几里得算法: 推导过程: 给出A和B,求它们的最大公约数,并且求出x和y,满足Ax+By=gcd(A,B). 当A=0时,x=0,y=1; 当A>0时, 因为exgcd(A,B,x,y)表示Ax+By=gcd(A,B) 而且ex

【poj2891】同余方程组

同余方程组 例题1:pku2891Strange Way to Express Integers 中国剩余定理求的同余方程组mod 的数是两两互素的.然而本题(一般情况,也包括两两互素的情况,所以中国剩余定理成为了“时代的眼泪”)mod的数可能不是互素,所以要转换一下再求. P=b1(mod a1);  P / a1 ==?~~~~b1 P =b2(mod a2); P =b3(mod a3); …… P =bn(mod an); a1~an,b1~bn是给出来的. 解: 第一条:a1*x+b1

再说中国剩余定理、扩展欧几里德和同余方程组

E - 解同余线性方程组1 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status Description Andy和Mary养了很多猪.他们想要给猪安家.但是Andy没有足够的猪圈,很多猪只能够在一个猪圈安家.举个例子,假如有16头猪,Andy建了3个猪圈,为了保证公平,剩下1头猪就没有地方安家了.Mary生气了,骂Andy没有脑子,并让他重新建立猪圈.这回Andy建造

C# 列主元素(Gauss)消去法 计算一元多次方程组

1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 7 namespace zblGauss1 8 { 9 class Program 10 { 11 static void Main(string[] args) 12 { 13 //double[,] a = { { 8.1, 2.3, -1

解一元一次方程

实际问题与一元一次方程 一般步骤:1.审.审清题意,   2.设.设未知数   3.列.根据等量关系列方程   4.解.解方程   5.答.写出答案 解一元一次方程一般步骤:   1.去分母   2.去括号   3.移项   4.合并同类项   5.化系数为1 题1:有一批零件加工任务,甲单独加工需要20小时,乙单独加工需要10小时,甲加工了一部分后另有任务,剩下的任务由乙单独完成,乙比甲少加工了5小时,求甲加工了几个小时? 设 甲加工了  (x+5)小时 乙加工了 x小时 x/10 + (x

C语言写解一元二次方程程序心得

前言:在网上看到不少解一元二次方程的小程序,在使用时总得出一大堆小数,感觉很不爽,遂自己重新写了一遍. 首先,先回忆一下一元二次方程的求根公式: 分别读取二次项.一次项和常数项系数并且求出delta 无解情况 此时同时输出delta的值,小于0,无解. 只有一个根的情况 当delta等于0,只有一个实数根,没什么好讲. 两个不相等实根的情况 重点就是这个部分. 为了避免一大堆小数的问题,分开sqrt(delta)是整数和非整数来.(如果是整数,则直接运算,如果不是整数,则保留根号) (1)sqr

解一元二次方程的解(网上找的,仅自用,非原创)

using System;class fangcheng{ public static void Main() { //声名变量 double a; double b; double c; double d; double e; double f; double g; double h; double i; double j; double k; Console.WriteLine("解一元二次方程"); //输入a的值 aa: Console.WriteLine("请输入a

机器自动解多元多次方程组的问题

* 矩阵计算获得数值结果 与 拓扑状态机之间存在什么样的关系呢? * 一个时间状态机,一个是空间拓扑机,两者之间的关系就是时空关系-多元三次方的关系 * 实现矩阵引擎的关键核心技术,就是机器自动解多元多次方程组 由于空间拓扑结构不能够改变,所以通过矩阵变换来解方程组的原理无法使用,只有很 原始的自动消元法可以使用,这种方法特别原始,但是却是唯一可行的办法 所以,难度还是不小,请各位耐心等待........ 原文地址:https://www.cnblogs.com/comsci/p/1027530