专栏文章
题解:P11532 [THUPC2025 初赛] 好成绩
P11532题解参与者 6已保存评论 5
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 5 条
- 当前快照
- 1 份
- 快照标识符
- @miqjump1
- 此快照首次捕获于
- 2025/12/04 05:59 3 个月前
- 此快照最后确认于
- 2025/12/04 05:59 3 个月前
中国剩余定理秒了。
没有用扩展欧几里得,思路见注释。
CPP#include<iostream>
#include<algorithm>
using namespace std;
#define ll long long
int n;
ll a[100010],p[100010];
ll gcd(ll a,ll b){
if (b==0) return a;
else return gcd(b,a%b);
}
void hebing(ll p1,ll a1,ll p2,ll a2,ll &p,ll &a){
if (p1<p2) swap(p1,p2),swap(a1,a2);
p=p1/gcd(p1,p2)*p2; //新方程的模数是两个旧方程的模数的最小公倍数。
a=a1;
while (a%p2!=a2)
a+=p1;
//从 a1 开始,挨个试是有没有合适的余数。
}
int main(){
cin >> n;
for (int i=1;i<=n;i++){
cin >> p[i] >> a[i];
a[i] %= p[i];
}
ll p_=1,a_=0;
for (int i=1;i<=n;i++)
hebing(p_,a_,p[i],a[i],p_,a_); //合并方程函数。
cout << a_ << endl;
}
//这个代码之所以可以过 P4777 是因为第十二行将模数较小的方程换到前面,从而减少了求 gcd 的时间。
//a_i 的最小公倍数是 1e18,所以 n=2 是才有可能卡掉,因为模数最大可以是 1e9。
//一旦有三个方程,模数最大只有 1e6,卡不掉了。
//此方法名叫大数翻倍法。
输入:
CPP3
3 2
5 3
7 6
输出:
CPP83
得到答案 ,符合标准,输出。
原创:某钟姓 dalao。
相关推荐
评论
共 5 条评论,欢迎与作者交流。
正在加载评论...