题目地址:http://lightoj.com/volume_showproblem.php?problem=1319
思路:暴力直接超时,用中国剩余定理
AC代码:
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <queue>
#include <stack>
#include <map>
#include <cstring>
#include <climits>
#include <cmath>
#include <cctype>
const int inf = 0x3f3f3f3f;//1061109567
typedef long long LL;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
using namespace std;
int a[15],b[15];
LL M;
void exgcd(LL a,LL b,LL &x,LL &y)
{
if(b == 0)
{
x = 1,y=0;
return;
}
else
{
exgcd(b,a%b,x,y);
LL temp = x;
x = y;
y = temp - (a/b)*y;
}
}
LL china(LL n)
{
M = 1;
LL x,y;
for(int i=0; i<n; i++)
M *= a[i];
LL ans = 0;
for(int i=0; i<n; i++)
{
LL Mi = M / a[i];
exgcd(Mi,a[i],x,y);
ans = (ans + Mi * x * b[i]) % M;
}
if(ans < 0)
ans += M;
return ans;
}
int main()
{
int t;
int cas = 1;
scanf("%d",&t);
while(t--)
{
int n;
scanf("%lld",&n);
for(int i=0; i<n; i++)
scanf("%lld%lld",&a[i],&b[i]);
printf("Case %d: %lld\n",cas++,china(n));
}
return 0;
}
超时代码:
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <queue>
#include <stack>
#include <map>
#include <cstring>
#include <climits>
#include <cmath>
#include <cctype>
const int inf = 0x3f3f3f3f;//1061109567
typedef long long ll;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
using namespace std;
int a[20],b[20];
int main()
{
int t;
scanf("%d",&t);
int cas = 1;
while(t--)
{
int n;
scanf("%d",&n);
for(int i=0; i<n; i++)
{
scanf("%d%d",&a[i],&b[i]);
}
int j;
for(int i=1; ;i++)
{
for(j=0; j<n; j++)
{
if(i % a[j] != b[j])
break;
}
if(j == n)
{
printf("Case %d: %d\n",cas++,i);
break;
}
}
}
return 0;
}