Shirlies
宁静专注认真的程序媛~

这一题做的有点小苦,但是最终取得了成功,(*^__^*) 嘻嘻……

起初不知道哪里出问题了,一直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 }

 

posted on 2012-04-15 13:06  Shirlies  阅读(326)  评论(0编辑  收藏  举报