一、题目描述
题目化简:一个数满足下列条件:输入一个数,接下来行两个数,第一个数为,第二个数为。除以每一个都余,求最小的。
二、思路分析
由于输入的数有可能不是按除数的大小排序的,所以我们需要用一个结构体按除数从大到小排序。
排序后我们要从大到小根据除数来依次枚举,每一次加的数都是当前枚举所有数的最小公倍数。
但是:1. 最开始s不能为0,因为这样永远都绕不开0!得为第一个数的余数。
2. 因为是下一个数,所以说第一个循环应该是<n
三、上代码
注意:有四处错误,改后就可AC!
#include<bits/stdc++.h>
using namespace std;
long long n,s,k=1;
struct pig{
long long a,b;
}a[10010];
bool cmp(pig x,pig y){
return x.a < y.a;
}
long long gcd(long long a,long long b){
return b?gcd(b,a%b):a;
}
long long lmd(long long a,long long b){
return a*b/gcd(a,b);
}
int main(){
cin >> n;
for(long long i = 1;i<=n;i++){
cin >> a[i].b >> a[i].b;
}
sort(a,a+n,cmp);
s = a[1].a;
for(long long i = 1;i<=n;i++){
k=lmd(k,a[i].a);
while(s%a[i+1].a != a[i+1].b){
s+=k;
}
}
cout << s;
return 0;
}