【中国剩余定理-入门】-C++
中国剩余定理也称孙子定理,是中国古代求解一次同余式组(见同余)的方法。是数论中一个重要定理。
这玩意在luogu居然有模板题:
[TJOI2009]猜数字
先来看一个问题:
在《孙子算经》中有这样一个问题:“今有物不知其数,三三数之剩二(除以3余2),五五数之剩三(除以5余3),七七数之剩二(除以7余2),问物几何?”
熟悉吗小学数学学过吗
这样的问题是基本的中国剩余定理的运用,解题过程有三步:
- 找出三个数:从\(3\)和\(5\)的公倍数中找出被\(7\)除余\(1\)的最小数\(15\),从\(3\)和\(7\)的公倍数中找出被\(5\)除余\(1\)的最小数\(21\),最后从\(5\)和\(7\)的公倍数中找出除\(3\)余\(1\)的最小数\(70\)。
- 用\(15\)乘以\(2\)(\(2\)为最终结果除以\(7\)的余数),用\(21\)乘以\(3\)(\(3\)为最终结果除以\(5\)的余数),同理,用\(70\)乘以\(2\)(\(2\)为最终结果除以\(3\)的余数),然后把三个乘积相加\(15∗2+21∗3+70∗2\)得到和\(233\)。
- 用\(233\)除以\(3,5,7\)三个数的最小公倍数\(105\),得到余数\(23\),即\(233%105=23\)。这个余数23就是符合条件的最小数。
不得不佩服古人的智慧
然后看回题目(链接在开头)
(n-a_1)|b_1\\
(n-a_2)|b_2\\
...\\
(n-a_k)|b_k
\end{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}\)成立。
这个不难理解,稍微理解一下就可以了。
然后把上面同余方程组变形一下:
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++的更多相关文章
- [转]POJ1006: 中国剩余定理的完美演绎
Biorhythms Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 117973 Accepted: 37026 Des ...
- Biorhythms(poj1006+中国剩余定理)
Biorhythms Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 117973 Accepted: 37026 Des ...
- Bell(hdu4767+矩阵+中国剩余定理+bell数+Stirling数+欧几里德)
Bell Time Limit:3000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit Status ...
- ACM/ICPC 之 中国剩余定理+容斥原理(HDU5768)
二进制枚举+容斥原理+中国剩余定理 #include<iostream> #include<cstring> #include<cstdio> #include&l ...
- 中国剩余定理(Chinese Remainder Theorem)
我理解的中国剩余定理的含义是:给定一个数除以一系列互素的数${p_1}, \cdots ,{p_n}$的余数,那么这个数除以这组素数之积($N = {p_1} \times \cdots \tim ...
- 51nod1079(中国剩余定理)
题目链接: http://www.51nod.com/onlineJudge/user.html#!userId=21687 题意: 中文题诶~ 思路: 本题就是个中国剩余定理模板题,不过模拟也可以过 ...
- HDU 5446 中国剩余定理+lucas
Unknown Treasure Time Limit: 1500/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Other ...
- poj1006生理周期(中国剩余定理)
/* 中国剩余定理可以描述为: 若某数x分别被d1..….dn除得的余数为r1.r2.….rn,则可表示为下式: x=R1r1+R2r2+…+Rnrn+RD 其中R1是d2.d3.….dn的公倍数,而 ...
- poj 1006:Biorhythms(水题,经典题,中国剩余定理)
Biorhythms Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 110991 Accepted: 34541 Des ...
随机推荐
- Matlab R2017b 关联 .m 和 .fig 文件
1. 前言 安装「Matlab R2017b」后,无法关联.m和.fig文件,每次需要在MATLAB里边打开,而不能之间点击.m文件打开,十分麻烦. 2. 解决方案 1.首先,在Matlab R201 ...
- CTeX error saving the project file
「Options -> ConfigurationWizard -> User Profiles > 点击 Create/Update User Profile 按钮」 重启WinE ...
- Windows10+Anaconda+PyTorch(cpu版本)环境搭建
1.安装Anaconda,具体参考网上相关教程 2.安装PyTorch 2.1 在Anaconda自带的Anaconda Prompt中创建名为PyTorch的虚拟环境[conda create -- ...
- 剑指offer13:数组[奇数,偶数],奇数偶数相对位置不变。
1. 题目描述 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变. 2. 思路和方 ...
- Python之推导式笔记
观察下面的代码: list1 = [] for i in range(10): list1.append(i) print(list1) 作为一个Java出身的程序员,我一定会这么写代码去生成一个列表 ...
- gopacket 在 windows 上面遇到的问题
前阵子有个需求是使用 golang 抓包改包,我用到了 gopacket 这个包,但是出了一些小问题. 我按照网上的方法进行使用 OpenLive 抓包,发现并不行,报错 error open ada ...
- 解决:error LNK1169: 找到一个或多个多重定义的符号
每一个c++项目中可以包含多个cpp文件和.h文件,不过只能有而且必须有一个cpp文件中包含main函数,否则就会报错.所以在一个c++项目中不能单独运行一个cpp文件,只能运行一个项目.如果你想一个 ...
- UI5-技术篇-SAPUI5创建自定义控件
转载:https://www.nabisoft.com/tutorials/sapui5/creating-custom-controls-in-sapui5 https://sapui5.h ...
- Python 自己实现可迭代对象
import time from collections import Iterable from collections import Iterator class Classmate(object ...
- SDcms1.8代码审计
由于工作原因,分析了很多的cms也都写过文章,不过觉得好像没什么骚操作都是网上的基本操作,所以也就没发表在网站上,都保存在本地.最近突然发现自己博客中实战的东西太少了,决定将以前写的一些文章搬过来,由 ...