题目链接
因为题目给的数据范围小,所有有两种解题方式
一、暴力法
代码如下:
#include<cstdio>
#include<iostream>
using namespace std;
int main(){
int a,b,c;
while(cin >> a >> b >> c){
for(int i = 10; i <= 100; i++){
if(i%3==a&&i%5==b&&i%7==c){
cout << i << endl;
break;
}
}
}
return 0;
}
二、中国剩余定理法
#include<iostream>
#include<algorithm>
using namespace std;
int a[3],m[3] = {3,5,7};
int extend_Euclid(int a,int b,int& x,int &y){
if(!b){
x = 1;
y = 0;
return a;
}
int r = extend_Euclid(b,a%b,y,x);
y -= a/b*x;
return r;
}
int CRT(int a[],int m[],int n)
{
int M = 1;
int ans = 0;
for(int i=0; i<n; i++)
M *= m[i];
for(int i=0; i<n; i++)
{
int x, y;
int Mi = M / m[i];
extend_Euclid(Mi, m[i], x, y);
ans = (ans + Mi * x * a[i]) % M;
}
if(ans < 0) ans += M;
return ans;
}
int main(){
while(cin >> a[0] >> a[1] >> a[2]){
cout << CRT(a,m,3) << endl;
}
return 0;
}
中国剩余定理会在ACM 数论里详细解析。