題目:給定n種硬幣,想要從其中取出四中當做桌子的腿,如果目標高度已知,求兩側最接近的高度。
分析:數論。枚舉其中的四格硬幣,計算最小公倍數,然後求出目標高度最接近兩個公倍數即可。
說明:注意使用long long,防止溢出╮(╯▽╰)╭。
#include <cstdio>
typedef long long ll;
int gcd(int a, int b)
{
return a%b?gcd(b, a%b):b;
}
ll lcm(int a, int b)
{
return 0LL+a/gcd(a, b)*b;
}
int main()
{
int n, m, table, coins[51];
ll L[51], R[51];
while (~scanf("%d%d",&n,&m) && n && m) {
for (int i = 0; i < n; ++ i)
scanf("%d",&coins[i]);
for (int i = 0; i < m; ++ i) {
scanf("%d",&table);
ll min = 0, max = -1, lcmvalue;
for (int a = 0; a < n; ++ a)
for (int b = 0; b < a; ++ b)
for (int c = 0; c < b; ++ c)
for (int d = 0; d < c; ++ d) {
lcmvalue = lcm(coins[a], coins[b]);
lcmvalue = lcm(lcmvalue, coins[c]);
lcmvalue = lcm(lcmvalue, coins[d]);
L[i] = table/lcmvalue*lcmvalue;
if (table == L[i])
R[i] = L[i];
else R[i] = L[i]+lcmvalue;
if (min < L[i])
min = L[i];
if (max < 0 || max > R[i])
max = R[i];
}
printf("%lld %lld\n",min,max);
}
}
return 0;
}