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

这玩意在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. java8 time包的简单使用

    import com.sun.org.apache.xml.internal.res.XMLErrorResources_tr; import java.text.DateFormat; import ...

  2. 数据结构:队列queue 函数push() pop size empty front back

    队列queue: push() pop() size() empty() front() back() push()  队列中由于是先进先出,push即在队尾插入一个元素,如:可以输出:Hello W ...

  3. python 之 前端开发( DOM操作)

    11.47 DOM操作 查找节点: 11.471 直接查找 document.getElementById //根据ID获取唯一一个标签 document.getElementsByClassName ...

  4. linux终端提示符修改

    Linux主机名莫名其妙的由@myhostname变成了@bogon了之后 1.在linux下添加一个127.0.0.2名叫bogon的主机此方法使用后,bogon主机名得以解析,使用的主机名仍为bo ...

  5. ReflectionTest:由输入的类名得到类的信息

    package reflection; import java.lang.reflect.*; import java.util.*; public class ReflectionTest { pu ...

  6. VUE框架概括+模块语法使用(上)

    vue是什么 官网(https://cn.vuejs.org/) Vue.js是一套构建用户界面的渐进式框架.与其他重量级框架不同的是,Vue 采用自底向上增量开发的设计: Vue 的核心库只关注视图 ...

  7. Java 处理异常 9 个最佳实践,你知道几个?

    1. 在Finally中清理资源或者使用Try-With-Resource语句 使用Finally Java 7的Try-With-Resource语句 2. 给出准确的异常处理信息 3. 记录你所指 ...

  8. [JZOJ5281]钦点题解--瞎搞+链表

    [JZOJ5281]钦点题解--瞎搞+链表 题目链接 于 暴 力 过

  9. VBA循环(十一)

    当需要多次执行一段代码时,就可以使用循环语句. 一般来说,语句是按顺序执行的:函数中的第一个语句首先执行,然后是第二个,依此类推. 编程语言提供了各种控制结构,允许更复杂的执行路径. 循环语句允许多次 ...

  10. vue进入页面时不在顶部,检测滚动返回顶部按钮

    这里是本小白使用时遇到的问题及个人使用的方法可能并不完美. 1.监测浏览器滚动条滚动事件及滚动距离 dmounted() { window.addEventListener("scroll& ...