70分求助
查看原帖
70分求助
105230
Doubeecat楼主2020/8/4 12:07

貌似取模出问题了……但是瞎改都没结果……

#include <algorithm>
#include <cstring>
#include <cstdio>
#include <cctype>
#include <cmath>
#define ll long long
#define ri register int

char buf[1 << 20], *p1, *p2;
#define getchar() (p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 1 << 20, stdin), p1 == p2)?EOF: *p1++)
template <typename T> inline void read(T &t) {
	ri v = getchar();T f = 1;t = 0;
	while (!isdigit(v)) {if (v == '-')f = -1;v = getchar();}
	while (isdigit(v)) {t = t * 10 + v - 48;v = getchar();}
	t *= f;
}
template <typename T,typename... Args> inline void read(T &t,Args&... args) {
	read(t);read(args...);
}

template <typename T> inline T min(T x,T y) {return x<y?x:y;}
template <typename T> inline T max(T x,T y) {return x>y?x:y;}
const int INF = 0x3f3f3f3f;
const ll inf = 0x3f3f3f3f3f3f3f3fLL;
const int N = 100;
ll a[N],b[N],n;
//题目本质 x \equiv bi (mod ai)

void exgcd(ll a,ll b,ll &x,ll &y) {
    if (!b)  {
        x = 1,y = 0;
        return ;
    }
    ll q = a / b;
    exgcd(b,a%b,y,x);
    y = y - q * x;
}

ll inv(ll a,ll b) {
    ll x,y;
    exgcd(a,b,x,y);
    return x;
}

ll CRT(const ll q[],const ll m[]) {
    ll M = 1,ans = 0;
    for (int i = 1;i <= n;++i) M *= m[i];
    for (int i = 1;i <= n;++i) {
        ll ni = M / m[i],ti = inv(ni,m[i]);
        ans = (ans + ni * ti * q[i]) % M;
    }
    return ans % M;
}

signed main() {
	read(n);
    for (int i = 1;i <= n;++i) read(a[i],b[i]);
    printf("%lld",CRT(b,a));
	return 0;
}
2020/8/4 12:07
加载中...