1 条题解
-
2
有些时候确实挺无助的
此题需要前置知识——扩展欧几里得算法(exgcd)
#include <bits/stdc++.h> #define int long long using namespace std; const int N = 15; int a[N],r[N],k; int exgcd(int a, int b, int &x, int &y) { if(b == 0) { x = 1; y = 0; return a; } int ans = exgcd(b, a % b, x, y); int t = x; x = y; y = t - a / b * y; return ans; } int crt(int k, int* a, int* r) { int n = 1, ans = 0; for(int i = 1; i <= k; i++) n = n * r[i]; for (int i = 1; i <= k; i++) { int m = n / r[i], b, y; exgcd(m, r[i], b, y); ans = (ans + a[i] * m * b % n) % n; } return (ans % n + n) % n; } signed main() { scanf("%lld",&k); for(int i=1;i<=k;i++) scanf("%lld%lld",&a[i],&r[i]); printf("%lld",crt(k,a,r)); return 0; }
- 1
信息
- ID
- 691
- 时间
- 1000ms
- 内存
- 512MiB
- 难度
- 10
- 标签
- 递交数
- 4
- 已通过
- 2
- 上传者