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 }

 

你可能感兴趣的:(OJ)