题目链接
P2651 添加括号III - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
题意
定义这样的一个序列:
- A = a1a2a3......an 它们代表 a1/a2/a3...../an
想通过在元素之间添加一些
括号,使得这个式子 算出来的是个整数.
解法
通过观察我们可以发现,无论如何添加括号 a1 总是分子 ,a2 一定是分母 , a3,a4.......an 算出来的 一定要是一个整数 ,为什么呢? 我们将分母消除到最少了 , 更多必然无利且可能有害, 那么我们可以变形一下式子。
a1∗a3∗a4......an/a2
这里说明如何将a3a4....an 转化到分子上面去
an.....a2a1
我们将 a1/a2/a3...../an−1 , 将前面看成一个整体 x/an−1/an , 此时 an 就被乘到分子上去了。
即下式
x∗an/an−1 我们只需要屡试不爽的使用整体角度,将分母的分母翻上去即可 , 最后就可以得到a1∗a3∗a4......an/a2。
两种做法
-
高精度:可以将前面一堆数乘起来,但是考虑精度问题,需要使用高精度。如果您愿意的话,那么请随意。
-
gcd : 我们发现如果满足条件的话 ,a1∗a3.....an 一定是 a_2 的正整数倍 i.e.x∗a2,x∈Z\*, 那么这一堆乘积里面一定有关于 a2 的所有相关质因数 而这些质因数都一定来自 a1a3.....an , 那么我们只需要每次求出 gcd(a2,ai)i∈(1,3,4.....) , 再从a2 中去掉这个质因数的相关部分即可。
相当于每次求出两个数质因数的相交部分,从 a2 中去掉 , 如果a2 可以整除 a1∗a3.....an 里 面一定包含了 a2 所以我们一定最后得到的a2 等于 1 , 如果不是 1 , 说明不包含 ,则不可以整除。