题目大意,给定一个整数表达式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 }