对每四个硬币求最小公倍数,然后判断是否满足。
#include <iostream>
#include<cstring>
#include<stdio.h>
using namespace std;
int n,t,a[55],b[20],save[10],cnt;
long long ans1[15],ans2[15];
long long gcd(long long a,long long b)
{
return b == 0? a:gcd(b,a%b);
}
long long lcm(long long a,long long b)
{
return a/gcd(a,b)*b;
}
void calc()
{
for(int j = 0; j < n; j++)
for(int k = j+1; k < n; k++)
for(int l = k+1; l < n; l++)
for(int m = l+1; m < n; m++)
{
long long cc = lcm(a[j],a[k]);
cc = lcm(cc,a[l]);
cc = lcm(cc,a[m]);
for(int i = 0; i < t; i++)
{
if(cc < b[i] && b[i] - b[i] % cc > ans1[i])
ans1[i] = b[i] - b[i] % cc;
if(cc < b[i] && cc*(b[i]/cc+1) < ans2[i])
ans2[i] = cc*(b[i]/cc+1);
if(cc > b[i] && cc < ans2[i])
ans2[i] = cc;
if(b[i]%cc==0) ans1[i] = ans2[i] = b[i];
}
}
}
int main()
{
while(scanf("%d %d",&n,&t),n+t)
{
cnt = 0;
for(int i = 0; i < n; i++) scanf("%d",&a[i]);
for(int i = 0 ; i < t; i++)
{
scanf("%d",&b[i]);
ans1[i] = 0;
ans2[i] = 100000000;
}
calc();
for(int i = 0; i < t; i++) printf("%lld %lld\n",ans1[i],ans2[i]);
}
return 0;
}