讨论 / 解法
bobchennan 2008-08-05 03:03:00
点我顶贴 收藏 删除
解法一:将表达式都表示成标准形式:比如先按a的降幂排列,a的幂相同的时候再按b的降幂排列,a、b的幂都相同的时候再按照c的降幂排列……

标准形式可以自己定义,只要相等的表达式化简得到的结果是唯一的就可以了。这个方法的问题是:标准形式的项数可能很多,比如(a+b)^10^10^10;还可能出现高精度计算。

解法二:对变量都替换成随机的整数值,对每个表达式进行表达式求值,求值的过程中对得到的结果对某个值取模。假设a,b,c……带入作表达式求值的整数值分别是a,b,c……,取模的数是M。假设两个表达式分别是f(a, b,... z)和g(a, b,...z)。

如果f(a, b,... z) MOD M ≠ g(a, b,...z) MOD M,那么一定有f ≠ g。

如果f(a, b,... z) MOD M = g(a, b,...z) MOD M (*),那么几乎有f = g成立。

因此只用作几次尝试,如果a,b,c,……取不同的值,M取不同的值的时候都有(*)成立,就可以判定f = g。

实际上,如果f = g,那么使得f(a, b,... z) = g(a, b,...z)的a, b,...z只有有限多个(跟表达式的次数有关)。因此当多组不同的a, b,...z都使得f(a, b,... z) = g(a, b,...z)成立,就可以说明f = g。

如果(*)成立,说明f(a, b,... z) ≡ g(a, b,...z) (MOD M),如果对于同一组a, b,... z有M1,M2,……,Mk,那么f(a, b,... z) ≡ g(a, b,...z) (MOD lcm(M1, M2,... Mk))。由于f(a, b,... z)和g(a, b,...z)都是有界的,因此可知f(a, b,... z) = g(a, b,...z)。

这里对M取模的作用是避免高精度计算。

#1 Mato完整版@2008-08-05 02:39:00
回复 删除
补充一下,代入a时千万不要代1、2这样的小数字(我就这么WA过的),最好代大质数(也不要太大,3、4位数就行了)。
#2 lychees@2008-08-05 02:58:00
回复 删除
我带了1000个

[-sqrt(maxlongint),-sqrt(maxlongint)]

的随机数...

#3 wish@2008-08-05 03:03:00
回复 删除
经过我对测试数据的研究发现,

代入6或7其中一个数即可满分

而且不会出现高精度运算

查看更多回复
提交回复