11.26闲话
啊?忘了今天赤羽生日
要不是K8He提醒就不记得了QAQ
去搜了一下↓
【赤羽2023诞生日】光【用泪重燃那新生的光△五维介质】
这个是生贺曲吗↑
是谁在看我的闲话,怎么高二学长都退役了还有阅读量
点击查看代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
int inv[1919810],fact[1234567];
inline int read(){
int s = 0,w = 1;char ch = getchar();
while(ch<'0'||ch>'9'){ if(ch == '-') w = -1;ch = getchar();}
while(ch>='0'&&ch<='9'){ s = s*10+ch-'0';ch = getchar();}
return s*w;
}
inline int qpow(int a,int k,int p){
int res=1;
while(k){
if(k&1) res=res*a%p;
k>>=1;
a=a*a%p;
}
return res;
}
inline int Comb(int a,int b,int p){
return a<b?0:fact[a]*inv[a-b]%p*inv[b]%p;
}
inline int lucas(int a,int b,int p){
if(!a||!b) return 1;
if(a<p&&b<p) return Comb(a,b,p);
return Comb(a%p,b%p,p)*lucas(a/p,b/p,p)%p;
}
signed main(){
#ifndef ONLINE_JUDGE
freopen("1.in","r",stdin);
freopen("1.out","w",stdout);
#endif
int K8=read(),p=1000003;
inv[0]=inv[1]=fact[1]=1;fact[0]=1;
for(int i=2;i<p;i++) fact[i]=(fact[i-1]*i)%p;
inv[p-1]=qpow(fact[p-1],p-2,p);
for(int i=p-2;i>=1;i--)
inv[i]=inv[i+1]*(i+1)%p;
while(K8--){
int a=read(),b=read(),c=read(),ans=0;
int m=c-b+1;
std::cout<<(lucas(m+a,m,p)+p-1)%p<<std::endl;
}
}
中国剩余定理(\(\mathrm {CRT}\))
对于两两互质的自然数\(\{m_1,m_2,m_3,\cdots,m_k\}\),记 $ m=\prod_{i=1}^{k} m_i$
在 \(\bmod \ \mathrm M\) 同余的意义下有唯一解
解为$$x=(\sum_{c=i}^{k}a_i\times \frac{ m}{m_i} \times (\frac{ m}{ m_i})^{-1})\bmod \ m$$
此处的 \((\dfrac{ m}{ m_i})^{-1}\)为\(\dfrac{ m}{ m_i}\)在\(\bmod \ m_i\)意义下的逆元
- 证明
当 \(i\neq j\) 时,有 \(m_j \equiv 0 \pmod {n_i}\) ,故 \(c_j \equiv m_j \equiv 0 \pmod {n_i}\) 。又有
\(c_i \equiv m_i \cdot (m_i^{-1} \bmod {n_i}) \equiv 1 \pmod {n_i}\) ,所以我们有:
对于 \(\forall i=1,2,\cdots,k\) ,得到的 \(x\) 总是满足 \(x\equiv a_i \pmod{n_i}\)
因为 \(a_i\) 没有特殊限制,所以 $ {\forall a_i}$ 都对应一个 \(x\) 。
对于 \(x\neq y\) ,\(\ \exists \ i\) 使得 \(x\)和 \(y\) 在 \(\bmod \ n_i\) 下不同余。
故方程组总是有唯一解。
代码
#include<bits/stdc++.h>
#define int long long
#define maxm 0X6CF
inline int read(){
int s = 0,w = 1;char ch = getchar();
while(ch<'0'||ch>'9'){ if(ch == '-') w = -1;ch = getchar();}
while(ch>='0'&&ch<='9'){ s = s*10+ch-'0';ch = getchar();}
return s*w;
}
inline int exgcd(int a,int b,int &x,int &y){
if(b==0){
x=1,y=0;
return a;
}
int d=exgcd(b,a%b,x,y);
int z=x;x=y,y=z-y*(a/b);
return d;
}
inline int exmod(int a,int b){
int d,x,y;
d=exgcd(a,b,x,y);
if(d==1) return(x%b+b)%b;
else return -1;
}
std::vector<int> a,m;
int M=1,x=0;
signed main(){
int n=read();
a.resize(n),
m.resize(n);
for(int i=0;i<n;i++){
M*=(m[i]=read());
a[i]=read();
}
for(int i=0;i<n;i++){
(x+=(a[i]*(M/m[i])*exmod(M/m[i],m[i])))%=M;
}
std::cout<<x;
}
拓展中国剩余定理(\(\mathrm {exCRT}\))
求解两个方程
转化为方程
再次转化即可得到
根据裴蜀定理
- 设 \(a,b\in \Z \land a,b\ne 0\) ,对 \(\forall x,y \in \Z\) ,满足 \(\gcd(a,b)\mid ax+by\) ,且 \(\exists x,y\in \Z\) , 使 \(ax+by=\gcd(a,b)\) .
当 \(a_2-a_1 \nmid \gcd(m_1,m_2)\) 时,无解
其余情况使用高贵的\(\mathrm {exgcd}\)可以求出一组解\((p,q)\)
此时\(x\equiv (m_1 \times p+a_1)\pmod {\mathrm{lcm}(m_1, m_2)}\)
对于多个方程
我们可以分类讨论,并两两合并成
接下来再次进行\(\mathrm {exCRT}\)
进行第二次合并,第三次合并....直到只剩下一个同余方程
此时使用高贵的\(\mathrm {exgcd}\)即可求解
赤羽生日快乐!