中国剩余定理也称孙子定理,是中国古代求解一次同余式组(见同余)的方法。是数论中一个重要定理。

这玩意在luogu居然有模板题:

[TJOI2009]猜数字

先来看一个问题:

在《孙子算经》中有这样一个问题:“今有物不知其数,三三数之剩二(除以3余2),五五数之剩三(除以5余3),七七数之剩二(除以7余2),问物几何?”

熟悉吗小学数学学过吗

这样的问题是基本的中国剩余定理的运用,解题过程有三步:

  1. 找出三个数:从\(3\)和\(5\)的公倍数中找出被\(7\)除余\(1\)的最小数\(15\),从\(3\)和\(7\)的公倍数中找出被\(5\)除余\(1\)的最小数\(21\),最后从\(5\)和\(7\)的公倍数中找出除\(3\)余\(1\)的最小数\(70\)。
  2. 用\(15\)乘以\(2\)(\(2\)为最终结果除以\(7\)的余数),用\(21\)乘以\(3\)(\(3\)为最终结果除以\(5\)的余数),同理,用\(70\)乘以\(2\)(\(2\)为最终结果除以\(3\)的余数),然后把三个乘积相加\(15∗2+21∗3+70∗2\)得到和\(233\)。
  3. 用\(233\)除以\(3,5,7\)三个数的最小公倍数\(105\),得到余数\(23\),即\(233%105=23\)。这个余数23就是符合条件的最小数。

不得不佩服古人的智慧

然后看回题目(链接在开头)

\[\begin{cases}
(n-a_1)|b_1\\
(n-a_2)|b_2\\
...\\
(n-a_k)|b_k
\end{cases}\\
\]

变形成同余方程组之后:

\[\begin{cases}
(n-a_1≡0)\pmod {b_1}\\
(n-a_2≡0)\pmod {b_2}\\
...\\
(n-a_k≡0)\pmod {b_k}\\
\end{cases}
\]

很明显的,

如果\(a≡b\pmod{m}\),则\(a+c≡b+c\pmod{m}\)成立。

这个不难理解,稍微理解一下就可以了。

然后把上面同余方程组变形一下:

\[ \begin{cases}\\
n\equiv a_1(\mod b_1)\quad \\ n\equiv a_2(\mod b_2)\quad \\ ...\quad \\
n\equiv a_k(\mod b_k)\quad \\ \end{cases}\\
\]

然后到这里就是中国剩余定理的裸题了。但是需要注意的是因为题目问题,我们需要对每一个\(a_i\)作这样的操作:

\(
a[i]=(a[i]\mod b[i]+b[i])modb[i];
\)

然后还需要注意的就是,这道题目因为数据良(bian)心(tai),所以还需要用快速乘来防止爆long long的情况。

代码:

#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll a[110],b[110];
ll k;
inline int read()
{
int x=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9'){
if(ch=='-')
f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9'){
x=(x<<1)+(x<<3)+(ch^48);
ch=getchar();
}
return x*f;
}
inline ll qmul(ll a, ll b, ll m)
{
ll res=0;
while(b>0)
{
if(b&1)res=(res+a)%m;
a=(a+a)%m;
b>>=1;
}
return res;
}
inline void exgcd(ll a,ll b,ll &x,ll &y)
{
if(b==0)
{
x=1,y=0;
return;
}
exgcd(b,a%b,x,y);
int tmp=x;
x=y,y=tmp-a/b*y;
return;
}
ll China()
{
ll ans=0,lcm=1;
for(ll i=1;i<=k;i++)
lcm*=b[i];
ll x,y;
for(ll i=1;i<=k;i++)
{
ll p=lcm/b[i];
exgcd(p,b[i],x,y);
x=(x%b[i]+b[i])%b[i];
ans=(ans+qmul(qmul(p,x,lcm),a[i],lcm))%lcm;
}
return (ans+lcm)%lcm;
}
int main()
{
cin>>k;
for(int i=1;i<=k;i++)
a[i]=read();
for(int i=1;i<=k;i++)
b[i]=read(),a[i]=(a[i]%b[i]+b[i])%b[i];
cout<<China();
return 0;
}

ov.

【中国剩余定理-入门】-C++的更多相关文章

  1. [转]POJ1006: 中国剩余定理的完美演绎

    Biorhythms Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 117973   Accepted: 37026 Des ...

  2. Biorhythms(poj1006+中国剩余定理)

    Biorhythms Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 117973   Accepted: 37026 Des ...

  3. Bell(hdu4767+矩阵+中国剩余定理+bell数+Stirling数+欧几里德)

    Bell Time Limit:3000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status  ...

  4. ACM/ICPC 之 中国剩余定理+容斥原理(HDU5768)

    二进制枚举+容斥原理+中国剩余定理 #include<iostream> #include<cstring> #include<cstdio> #include&l ...

  5. 中国剩余定理(Chinese Remainder Theorem)

    我理解的中国剩余定理的含义是:给定一个数除以一系列互素的数${p_1}, \cdots ,{p_n}$的余数,那么这个数除以这组素数之积($N = {p_1} \times  \cdots  \tim ...

  6. 51nod1079(中国剩余定理)

    题目链接: http://www.51nod.com/onlineJudge/user.html#!userId=21687 题意: 中文题诶~ 思路: 本题就是个中国剩余定理模板题,不过模拟也可以过 ...

  7. HDU 5446 中国剩余定理+lucas

    Unknown Treasure Time Limit: 1500/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Other ...

  8. poj1006生理周期(中国剩余定理)

    /* 中国剩余定理可以描述为: 若某数x分别被d1..….dn除得的余数为r1.r2.….rn,则可表示为下式: x=R1r1+R2r2+…+Rnrn+RD 其中R1是d2.d3.….dn的公倍数,而 ...

  9. poj 1006:Biorhythms(水题,经典题,中国剩余定理)

    Biorhythms Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 110991   Accepted: 34541 Des ...

随机推荐

  1. Matlab R2017b 关联 .m 和 .fig 文件

    1. 前言 安装「Matlab R2017b」后,无法关联.m和.fig文件,每次需要在MATLAB里边打开,而不能之间点击.m文件打开,十分麻烦. 2. 解决方案 1.首先,在Matlab R201 ...

  2. CTeX error saving the project file

    「Options -> ConfigurationWizard -> User Profiles > 点击 Create/Update User Profile 按钮」 重启WinE ...

  3. Windows10+Anaconda+PyTorch(cpu版本)环境搭建

    1.安装Anaconda,具体参考网上相关教程 2.安装PyTorch 2.1 在Anaconda自带的Anaconda Prompt中创建名为PyTorch的虚拟环境[conda create -- ...

  4. 剑指offer13:数组[奇数,偶数],奇数偶数相对位置不变。

    1. 题目描述 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变. 2. 思路和方 ...

  5. Python之推导式笔记

    观察下面的代码: list1 = [] for i in range(10): list1.append(i) print(list1) 作为一个Java出身的程序员,我一定会这么写代码去生成一个列表 ...

  6. gopacket 在 windows 上面遇到的问题

    前阵子有个需求是使用 golang 抓包改包,我用到了 gopacket 这个包,但是出了一些小问题. 我按照网上的方法进行使用 OpenLive 抓包,发现并不行,报错 error open ada ...

  7. 解决:error LNK1169: 找到一个或多个多重定义的符号

    每一个c++项目中可以包含多个cpp文件和.h文件,不过只能有而且必须有一个cpp文件中包含main函数,否则就会报错.所以在一个c++项目中不能单独运行一个cpp文件,只能运行一个项目.如果你想一个 ...

  8. UI5-技术篇-SAPUI5创建自定义控件

    转载:https://www.nabisoft.com/tutorials/sapui5/creating-custom-controls-in-sapui5     https://sapui5.h ...

  9. Python 自己实现可迭代对象

    import time from collections import Iterable from collections import Iterator class Classmate(object ...

  10. SDcms1.8代码审计

    由于工作原因,分析了很多的cms也都写过文章,不过觉得好像没什么骚操作都是网上的基本操作,所以也就没发表在网站上,都保存在本地.最近突然发现自己博客中实战的东西太少了,决定将以前写的一些文章搬过来,由 ...