COJ1127(芝麻开门)

题目链接

题目大意,给定一个整数表达式A1/A2/A3/.../An,('/'为除号1<=n<=10000,1<=Ai<=1000000000),问是否能通过添加括号使得表达式的值为整数。咋一看似乎没思路,但仔细想,不难发现这里存在最优策略,最优策略是用一个括号将表达式变成A1/(A2/A3/.../An)。证明如下:n为1时,直接输出"YES",n大于1时,首先,A2一定为分母,无论如何添加括号都无法改变这个事实,其次,按照上面的策略加括号后,只有A2为分母,所以这是个最优策略。有了最优策略后,我们需要做的就是不断约分(求最大公约数),看能否将其约为1,若能,表达式结果能为整数,否则不能。

View Code
 1 #include <stdio.h>
 2 int gcd(int a,int b)
 3 {
 4     int t;
 5     while(a%b)  t=a,a=b,b=t%b;
 6     return b;
 7 }
 8 int main()
 9 {
10     int i,n,a,b;
11     while(~scanf("%d",&n))
12     {
13         scanf("%d",&a);
14         if(n==1)
15         {
16             printf("YES\n");
17             continue;
18         }
19         scanf("%d",&b);
20         b/=gcd(a,b);
21         for(i=2;i<n;i++)
22         {
23             scanf("%d",&a);
24             if(b-1) b/=gcd(a,b);
25         }
26         if(b-1) printf("NO\n");
27         else    printf("YES\n");
28     }
29     return 0;
30 }

 

posted @ 2012-04-13 09:51  BeatLJ  阅读(195)  评论(0编辑  收藏  举报