洛谷P1495 【模板】中国剩余定理(CRT)/曹冲养猪+扩展欧几里得求逆元
TITLE
思路
CRT
x ≡ a 1 ( m o d m 1 ) x\equiv a_1\pmod {m_1} x≡a1(modm1)
x ≡ a 2 ( m o d m 2 ) x\equiv a_2\pmod {m_2} x≡a2(modm2)
… … …… ……
x ≡ a n − 1 ( m o d m n − 1 ) x\equiv a_{n-1}\pmod {m_{n-1}} x≡an−1(modmn−1)
x ≡ a n ( m o d m n ) x\equiv a_n\pmod{m_n} x≡an(modmn)
m两两互质
设 M = ∏ i = 1 n m i , M / m i ∗ t i ≡ 1 ( m o d m i ) 设M=\prod_{i=1}^n m_i,M/m_i*t_i\equiv 1\pmod {m_i} 设M=∏i=1nmi,M/mi∗ti≡1(modmi)
a i ∗ ( M / m i ) ∗ t i ≡ 0 ( m o d m j ) ( i ≠ j ) a_i*(M/m_i)*t_i≡0\pmod{m_j}(i\not=j) ai∗(M/mi)∗ti≡0(modmj)(i=j)
a i ∗ ( M / m i ) ∗ t i ≡ a i ( m o d m i ) a_i*(M/m_i)*t_i≡a_i\pmod{m_i} ai∗(M/mi)∗ti≡ai(modmi)
加 a i ∗ ( M / m i ) ∗ t i 只 会 影 响 ( m o d m i ) 加a_i*(M/m_i)*t_i只会影响\pmod{m_i} 加ai∗(M/mi)∗ti只会影响(modmi)
( m o d m i ) 时 , t i ∗ ( M / m i ) ≡ 1 , a i ∗ ( M / m i ) ∗ t i ≡ a i \pmod{m_i}时,t_i*(M/m_i)\equiv1,a_i*(M/m_i)*t_i\equiv a_i (modmi)时,ti∗(M/mi)≡1,ai∗(M/mi)∗ti≡ai
a n s = ∑ i = 1 n a i ∗ t 1 ∗ ( M / m i ) ans=\sum_{i=1}^n a_i*t_1*(M/m_i) ans=∑i=1nai∗t1∗(M/mi)
扩展欧几里得求逆元
扩 展 欧 几 里 得 求 a − 1 ( m o d m ) 扩展欧几里得求a^{-1}\pmod m 扩展欧几里得求a−1(modm)
a ∗ x ≡ 1 ( m o d m ) ( a n s = x ) a*x\equiv 1\pmod m(ans=x) a∗x≡1(modm)(ans=x)
a ∗ x + m ∗ y = 1 a*x+m*y=1 a∗x+m∗y=1
a ∗ x + m ∗ y = gcd ( a , m ) ( a , m 互 质 , gcd ( a , m ) = 1 ) a*x+m*y=\gcd(a,m)(a,m互质,\gcd(a,m)=1) a∗x+m∗y=gcd(a,m)(a,m互质,gcd(a,m)=1)
扩 展 欧 几 里 得 求 , a n s = x 扩展欧几里得求,ans=x 扩展欧几里得求,ans=x
CODE
#include<iostream>
#include<cstdio>
using namespace std;
void exgcd(long long a,long long b,long long &x,long long &y)
{
if(!b){
x=1,y=0;return;}
exgcd(b,a%b,x,y);
long long tmp=x;x=y,y=tmp-a/b*y;
return;
}
long long niyuan(long long s,long long m)
{
long long x,y;
exgcd(s,m,x,y);
return (x%m+m)%m;
}
int main()
{
long long n,lcm=1,x,y,i,ans=0,a[21],m[21];
for(scanf("%lld",&n),i=1;i<=n;i++)scanf("%lld%lld",&m[i],&a[i]),lcm*=m[i];
for(i=1;i<=n;i++)ans=(ans+lcm/m[i]*a[i]*niyuan(lcm/m[i],m[i]))%lcm;
printf("%lld",ans+(ans<0)*lcm);
return 0;
}