【题目描述】
经过无尽的蘑菇和无尽的不知道错在哪里、不知道发生了什么只下,恭喜KZ成功的造出了数据!!可喜可贺可喜可贺
给出一个这样的除法表达式:X1/X2/X3/X4/X5/X6..../Xk,
正常的除法表达式是从左往右计算的,但是我们可以向其中添加括号,以改变它的运算顺序,如1/2/1/2=1/4 , (1/2)/(1/2)=1 ;
那么, 给定一个除法表达式,能否通过添加括号使它的值为正整数?
【输入格式】
多行
每行一个除法表达式
【输出格式】
多行
对应输入,分别输出“YES”(能为正整数)或“NO”(不能为正整数)
【样例输入】
8/4/7/10/99 6/8/5/2/3
【样例输出】
YES NO
【提示】
3<=k<=10000 , 0<X<=0x7fffffff
【来源】
《算法竞赛入门经典(第2版)》第10章
题意 : 在任意位置处添加括号,问是否使得运算的结果是一个整数
思路分析 : 显然对于一个除法表达式,第一个元素一定是在分子的位置上,第二个元素一定是在分母的位置上,其余所有的元素都是在分子上,不断的求gcd约分即可,直到分母为 1 ,代表可以,否则是不可以。
代码示例 :
#define ll long long
const ll maxn = 5e5+5;
const ll mod = 1e9+7;
const double eps = 1e-9;
const double pi = acos(-1.0);
const ll inf = 0x3f3f3f3f;
char s[maxn];
ll num[10005];
ll gcd(ll a, ll b){
return b==0?a:gcd(b, a%b);
}
int main() {
freopen("baoquansl.in", "r", stdin);
freopen("baoquansl.out", "w", stdout);
while(~scanf("%s", s)){
ll len = strlen(s);
s[len] = '/';
ll f = 0, k = 1;
for(ll i = 0; i <= len; i++){
if (s[i] == '/') {num[k++] = f; f = 0;}
else {
f = f*10+(s[i]-'0');
}
}
//for(ll i = 1; i <k; i++) prllf("%d ", num[i]);
swap(num[1], num[2]);
ll sign = 0;
for(ll i = 2; i < k; i++){
ll g = gcd(num[1], num[i]);
num[1] /= g;
}
if (num[1] == 1) printf("YES\n");
else printf("NO\n");
}
return 0;
}