NYOJ-1013除法表达式
除法表达式
- 描述
-
给出一个这样的除法表达式:X1/X2/X3/···/Xk,其中Xi是正整数。除法表达式应当按照从左到右的顺序求和,例如表达式1/2/1/2的值为1/4。但是可以在表达式中嵌入括号以改变计算顺序,例如表达式(1/2)/(1/2)的值为1.

- 输入
- 首先输入一个N,表示有N组测试数据,
每组数据输入占一行,为一个除法表达式,
输入保证合法。
使表达式的值为整数。k<=10000,Xi<=100000000. - 输出
- 输出YES或NO
- 样例输入
-
1
1/2/1/2 - 样例输出
- YES
(1)思路方向分析
不难知道整个表达式最后一定会变成这样的形式:A/B
而A,B都可以表达为这些数中某一部分的乘积。自然就会想到B越小越好,最好是1,这样就可以变成整数了~( ̄▽ ̄)"
经过一些尝试后会发现,X2必然在B中,而其他数都可以在上,这样问题就简单明了了
设 E=(X1X3X4X5X6...Xk)/X2 只需要判断E是否为整数即可!(ง •_•)ง
(2)方法
方一:
简单粗暴直接算,不会高精度的会溢出,会高精度的打码打到手抽(;´д`)ゞ
方二:
使用唯一分解定理,把X2拆了,然后看看剩下所有的Xi们能不能贡献出所需的pi对应的次数ai,这个方法很正确,但还可以更优化一点
方三:
没错就是直接约分~!每次把X2除掉与Xi的gcd,这样除k遍后如果X2是1那么E就是整数啦~(●ˇ∀ˇ●)
口以这么写:
bool judge(int *X) {
X[2] /= gcd(X[2],X[1]);
for(int i = 3;i <= k;i++) X[2] /= gcd(X[i],X[2]);
return X[2] == 1;
}
这个算法的关键是gcd,而这也是我学习这道题的主要目的。
推荐这个文章,写的真是太好了(´▽`ʃ♡ƪ),另外下方的评论也请不要错过!!
这个文章给出的最强gcd如下,O(log(max(a, b)))
int superGcd(int a,int b)
{
if(a==0)return b;
if(b==0)return a;
if(!(a&1)&&!(b&1))return superGcd(a>>1,b>>1)<<1;
else if(!(b&1))return superGcd(a,b>>1);
else if(!(a&1))return superGcd(a>>1,b);
else return superGcd(abs(a-b),min(a,b));
}
相关证明可以进一步的查看这里
假设有两个数x和y,存在一个最大公约数z=(x,y),即x和y都有公因数z,
那么x一定能被z整除,y也一定能被z整除,所以x和y的线性组合mx±ny也一定能被z整除。(m和n可取任意整数)对于辗转相除法来说,思路就是:若x>y,设x/y=n余c,则x能表示成x=ny+c的形式,将ny移到左边就是x-ny=c,由于一般形式的mx±ny能被z整除,
所以等号左边的x-ny(作为mx±ny的一个特例)就能被z整除,即x除y的余数c也能被z整除。
而更相减损术则就是把x/y=n余c变成x-y=c同样都可以被z整除,所以把c与x或y放在一起求gcd都是不变的
我再说一遍,位移大法好啊啊啊啊啊

#include <cstdio>
using namespace std;
int n,X[10005],k;
char w;
int min(int a,int b)
{
if(a<b)return a;
else return b;
}
int abs(int a)
{
if(a<0)return 0-a;
else return a;
}
int gcd(int a,int b)
{
if(a==0)return b;
if(b==0)return a;
if(!(a&1)&&!(b&1))return gcd(a>>1,b>>1)<<1;
else if(!(b&1))return gcd(a,b>>1);
else if(!(a&1))return gcd(a>>1,b);
else return gcd(abs(a-b),min(a,b));
}
bool judge(int *X) {
X[2] /= gcd(X[2],X[1]);
for(int i = 3;i <= k;i++) X[2] /= gcd(X[i],X[2]);
return X[2] == 1;
}
int main()
{
scanf("%d",&n);
while(n--)
{
k=1;
scanf("%d",&X[1]);
w=getchar();
do{
scanf("%d",&X[++k]);
w=getchar();
}while(w=='/');
if(judge(X))printf("YES\n");
else printf("NO\n");
}
return 0;
}
所以以上为完整呆码~( ̄▽ ̄)"
顺带一提,如果你用欧几里得算法来求gcd,那么递归层数不会超过 4.785lgN+1.6723
我想我接下来就应该弄拓展欧几里得吧。。。
end——2018/3/9
NYOJ-1013除法表达式的更多相关文章
- NYOJ 1013 除法表达式(欧几里德算法+唯一分解定理)
题目链接: http://acm.nyist.edu.cn/JudgeOnline/problem.php?pid=1013 描述 给出一个这样的除法表达式:X1/X2/X3/···/Xk,其中Xi是 ...
- cogs 2060. 除法表达式
2060. 除法表达式 ★★ 输入文件:baoquansl.in 输出文件:baoquansl.out 简单对比时间限制:1 s 内存限制:256 MB [题目描述] 经过无尽的蘑菇和 ...
- [LeetCode] Evaluate Division 求除法表达式的值
Equations are given in the format A / B = k, where A and B are variables represented as strings, and ...
- NYOJ 128 前缀表达式的计算
前缀式计算 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描述 先说明一下什么是中缀式: 如2+(3+4)*5这种我们最常见的式子就是中缀式. 而把中缀式按运算顺序加上括 ...
- [LeetCode] 399. Evaluate Division 求除法表达式的值
Equations are given in the format A / B = k, where A and B are variables represented as strings, and ...
- cogs2060 除法表达式
http://blog.csdn.net/sdfzyhx/article/details/52254071 作为分母的数当然是越少越好.将x2作为分母,其他作为分子,不断约分,最后判断. /*by S ...
- 【个人项目总结】C#四则运算表达式生成程序
S1&2.个人项目时间估算 PSP表格如下: PSP2.1 Personal Software Process Stages Time(Before) Time(After) Planning ...
- C语言编程入门之--第五章C语言基本运算和表达式-part2
5.1.4 再来一个C库函数getchar吸收回车键 回车键也是一个字符,在使用scanf的时候,输入完毕要按下回车键,这时候回车键也会被输入到stdin流中,会搞乱我们的程序. 注意:stdin是输 ...
- 杭电ACM分类
杭电ACM分类: 1001 整数求和 水题1002 C语言实验题——两个数比较 水题1003 1.2.3.4.5... 简单题1004 渊子赛马 排序+贪心的方法归并1005 Hero In Maze ...
随机推荐
- JAVA实现多线程的两种方法
参考URL: http://www.cnblogs.com/jbelial/archive/2013/03/17/2964472.html 1.继承 java.lang.Thread 类. 2.实现R ...
- SpringBoot中logback.xml使用application.yml中属性
教你如何使用 springProfile 与 springProperty 让你的logback.xml 配置显得更有逼格,当别人还在苦苦挣扎弄logback-{profile}.xml的时候 你一个 ...
- binlog
binlog基本定义:二进制日志,也成为二进制日志,记录对数据发生或潜在发生更改的SQL语句,并以二进制的形式保存在磁盘中: 作用:MySQL的作用类似于Oracle的归档日志,可以用来查看数据库的变 ...
- iOS不同版本号适配问题(#ifdef __IPHONE_7_0)
部分參考http://www.cnblogs.com/ios8/p/ios-version-com.html 以下举个简单的样例来说明在iOS7.0和iOS6.1(以及更低版本号)之间的适配问题(用的 ...
- 《Android源代码设计模式解析与实战》读书笔记(八)
第八章.状态模式 1.定义 状态模式中的行为是由状态来决定,不同的状态下有不同的行为.当一个对象的内在状态改变时同意改变其行为,这个对象看起来像是改变了其类. 2.使用场景 1.一个对象的行为取决于它 ...
- 【待解决】maven创建web项目报错
创建web项目时报错
- luogu2833 等式
题目大意 给出\(a,b,c,x_1,x_2,y_1,y_2\),求满足\(ax+by+c=0\),且\(x\in[x1,x2],y\in [y1,y2]\)的整数解有多少对. 题解 用扩展欧几里得算 ...
- EOJ 3037 十六进制加法
请编写程序实现两个十六进制整数的加法. 例如:十六进制整数 3762 和 05C3,3762+05C3 =3D25 十六进制整数 CB9 和 957,CB9+957=1610 Input 第 1 行: ...
- Spring进行表单验证
转自:https://www.tianmaying.com/tutorial/spring-form-validation 开发环境 IDE+Java环境(JDK 1.7或以上版本) Maven 3. ...
- Juniper交换机维护
Juniper交换机维护操作之一: 1.1 交换机启动和关闭 1.1.1 重新启动 1. 使用具有足够权限的用户名和密码登陆CLI命令行界面. 2. 在提示符下输入下面的命令: use ...