不说话了直接上代码
#include <bits/stdc++.h> using namespace std; const int N = 1000100; namespace NT { bool isnot[N]; int mu[N], phi[N]; int primes[N], ptot; void normal_sieve( int n ) { isnot[1] = true; for( register int i = 2; i <= n; i++ ) { if( !isnot[i] ) { for( register int j = i + i; j <= n; j += i ) { isnot[j] = true; } } } } void linear_sieve( int n ) { isnot[1] = true; for( int i = 2; i <= n; i++ ) { if( !isnot[i] ) primes[ptot++] = i; for( int t = 0; t < ptot; t++ ) { int j = primes[t] * i; if( j > n ) break; isnot[j] = true; if( i % primes[t] == 0 ) break; } } } void linear_sieve_more( int n ) { isnot[1] = true; mu[1] = 1; phi[1] = 1; for( int i = 2; i <= n; i++ ) { if( !isnot[i] ) { primes[ptot++] = i; mu[i] = -1; phi[i] = i - 1; } for( int t = 0; t < ptot; t++ ) { int j = primes[t] * i; if( j > n ) break; isnot[j] = true; mu[j] = mu[primes[t]] * mu[i]; phi[j] = phi[primes[t]] * phi[i]; if( i % primes[t] == 0 ) { mu[j] = 0; phi[j] = primes[t] * phi[i]; break; } } } } // greatest common divisor long long gcd( long long a, long long b ) { return b == 0 ? a : gcd( b, a % b ); } long long lcm( long long a, long long b ) { return a / gcd(a,b) * b; } // gcd(a,b) = a * x + b * y long long exgcd( long long a, long long b, long long &x, long long &y ) { if( b == 0 ) { x = 1; y = 0; return a; } else { long long x0, y0; long long cd = exgcd( b, a % b, x0, y0 ); x = y0; y = x0 - (a/b) * y0; return cd; } } int main() { int a, b; while( scanf("%d%d",&a,&b) == 2 ) { long long x, y; long long cd = exgcd(a,b,x,y); printf( "%lld = %d * %lld + %d * %lld\n", cd, a, x, b, y ); } } // ax + by = c bool linear_equation( long long a, long long b, long long c, long long &x, long long &y, long long &xinc, long long &yinc ) { long long d = gcd(a,b); if( c % d != 0 ) return false; a /= d, b /= d, c /= d; exgcd( a, b, x, y ); x *= c; y *= c; xinc = b; yinc = -a; return true; } // a^(-1) long long inverse( long long a, long long mod ) { long long x, y; exgcd( a, mod, x, y ); return (x % mod + mod) % mod; } /* long long inverse( long long a, long long mod ) { // require mod is a prime return mpow(a, mod-2, mod); } */ // Chinese Remainder Theorem // x = a ( mod m ) long long crt( vector<long long> va, vector<long long> vm ) { int n = (int)va.size(); long long M = 1; for( int t = 0; t < n; t++ ) M *= vm[t]; long long ans = 0; for( int t = 0; t < n; t++ ) { long long ci = M / vm[t]; long long invci = inverse(ci,vm[t]); ans += ci * invci % M * va[t] % M; if( ans >= M ) ans -= M; } return ans; } // lucas't theorem // C(n,m) = C(n / p, m / p) * C(n % p, m % p) ( mod p ) when 0 <= m <= n // C(n,m) = 0 ( mod p ) when m > n long long fac[N], vfac[N]; long long comb( long long n, long long m, long long p ) { if( m > n ) return 0; return fac[n] * vfac[m] % p * vfac[n-m] % p; } long long lucas( long long n, long long m, long long p ) { if( m > n ) return 0; if( n / p == 0 ) return 1; return lucas( n / p, m / p, p ) * comb( n % p, m % p, p ) % p; } } long long exgcd( long long a, long long b, long long &x, long long &y ) { if( b == 0 ) { x = 1; y = 0; return a; } else { long long x0, y0; long long cd = exgcd( b, a % b, x0, y0 ); x = y0; y = x0 - (a/b) * y0; return cd; } } long long inverse( long long a, long long mod ) { long long x, y; exgcd( a, mod, x, y ); return (x % mod + mod) % mod; } long long crt( vector<long long> va, vector<long long> vm ) { int n = (int)va.size(); long long M = 1; for( int t = 0; t < n; t++ ) M *= vm[t]; long long ans = 0; for( int t = 0; t < n; t++ ) { long long ci = M / vm[t]; long long invci = inverse(ci,vm[t]); ans = (ans + ci * invci % M * va[t])% M; } return ans; } int main() { vector<long long> va, vm; va.push_back(2);vm.push_back(3); va.push_back(3);vm.push_back(5); va.push_back(0);vm.push_back(4); long long ans = crt(va, vm); printf("%I64d\n", ans); }板子方便使用