这一题做的有点小苦,但是最终取得了成功,(*^__^*) 嘻嘻……
起初不知道哪里出问题了,一直WA,然后对照网上的代码一步一步的改啊,提交啊,最终AC了,然后又一步一步的改回到自己原来的样子,(~ o ~)~zZ错误找到了。。。
不知道WA了多少次,又AC了多少次,不计算了,而且我的代码运行时间比网上的代码时间更短,成就啊,不过有点小浪费空间,其实两个循环可以合并,就少一点空间了。。。
代码如下:
1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 5 int length[60]; 6 int que[60]; 7 long long lcm[250000]; 8 int n,t; 9 int num; 10 11 long long gcd(long long a,long long b) 12 { 13 return b == 0?a:gcd(b,a%b); 14 } 15 long long get_lcm(long long a,long long b,long long c,long long d) 16 { 17 long long g = a/gcd(a,b)*b; 18 g = g/gcd(g,c) * c; 19 g = g / gcd(g,d) * d; 20 21 return g; 22 } 23 void solve() 24 { 25 num = 0; 26 for(int i = 0;i < n;i ++) 27 { 28 for(int j = i+1;j < n;j ++) 29 { 30 for(int k = j + 1;k < n;k ++) 31 { 32 for(int s = k + 1;s < n;s ++) 33 { 34 lcm[num ++] = get_lcm(length[i],length[j],length[k],length[s]); 35 } 36 } 37 } 38 } 39 long long low,high; 40 for(int h = 0;h < t;h ++)//这个可以和上面的合并的,可以减少空间需求 41 { 42 int tmp; 43 scanf("%d",&tmp); 44 low = 0; 45 high = 0x7f7f7f7f;//这里赋值要注意点 46 for(int i = 0;i < num;i ++) 47 { 48 long long p = tmp/lcm[i] * lcm[i]; 49 long long q = (tmp % lcm[i] == 0?(tmp/lcm[i]):(tmp/lcm[i] + 1))*lcm[i]; 50 if(p > low) 51 low = p; 52 if(q < high) 53 high = q; 54 } 55 printf("%lld %lld\n",low,high); 56 } 57 58 } 59 60 int main() 61 { 62 while(scanf("%d%d",&n,&t) == 2) 63 { 64 if(n == 0&&t == 0) 65 break; 66 67 for(int i = 0;i < n;i ++) 68 { 69 scanf("%d",&length[i]); 70 } 71 72 solve(); 73 } 74 75 return 0; 76 }