讨论 / 额。。
wish 2008-10-06 05:48:00
点我顶贴 收藏 删除
这题貌似会让[color=green]数学竞赛[/color]的同志们怨念的。。
#1 lychees@2008-10-01 08:45:00
回复 删除
....晕了.....- -
#2 Zx.MYS@2008-10-02 00:25:00
回复 删除
不会做……
#3 DarkMaster@2008-10-02 00:30:00
回复 删除
死了...

#4 Jollwish@2008-10-03 07:12:00
回复 删除
不太会..

就算会也不想写..

肯定很长...

#5 lishanshan@2008-10-03 07:30:00
回复 删除
[color=red] 初看这道题,似乎就是和以前做过的找循环节的题目一样,只要记录余数就可以了。但是这是要求P进制小数的循环节,而且是形如(1/N)且N为质数,这就让我们不得不思考一些别的方法了。

[color=red] 首先,P进制小数的求法众所周知,是通过不停地在原小数上乘进制P取整数位。那么在原小数(1/N)上我们是否就可以将每一位看成是P^K/N呢?(k是当前长度)这个分数的整数部分就是小数的值(在这里其实不需要考虑),而真分数的值就是当前的余数。由于质数产生的循环小数全是纯循环小数(所有不含2,5质因子的数的倒数如果是循环小数则是纯循环小数),那么当P^K mod N=1时,就一定是循环节了。

[color=red] 现在已经简化了问题,但是不停地将P往上乘时间耗费是巨大的。通过欧拉函数的性质,当P^K mod N=1时,K一定是N的欧拉函数值的约数,由于N为质数,那么K就一定是(N-1)的约数了。这样可以减少一部分时间,但是最后的数据仍然超时。

[color=red] 利用同余性质,a mod n=x, b mod n=y 则 a*b mod n=x*y mod n。我们可以将之前的结果保存下来,然后在之后的计算中通过之前的结果求出当前结果,而不是一次次地往上累乘.时间效率大大提高,这样,程序就能在所有数据中完美通过了。

[color=green]参考资料来源:http://www.nevergoby.cn/article.asp?id=27

#6 libojie@2008-10-04 08:44:00
回复 删除
楼上正解。

我十分惊讶地看到我曾经费很长时间思考的题目竟然已经被解决了,而当时并没有找到答案。看来研究这些数论问题的OIers为数不少啊!

例如:求1/2008的循环节长度(答案:50)本题为了简单,设定进制与数n互质。

涉及到数论知识。首先,10^φ(m)≡1 (mod m), 是欧拉函数的性质,在此略去证明。对正整数n,欧拉函数是不大于n的数中与n互质的数的数目。而1/2008的循环节长度等于1/251的循环节长度,因为循环小数乘除2或5的任意幂次,循环节长度不变,乘除的2、5在mod 10时不会体现。10t≡1(mod n)与循环小数的关系,就是10t被n除余数为1,这样在除法式中,除到第t位时余数与开始时相同,这意味着新的循环开始了,即t是循环节长度。而251是质数,其欧拉函数为251-1=250. 由于250必为循环节长度的整数倍,故一个循环节的长度为250的约数,对约数从小到大逐一试验即可。

在本题中,联想10^φ(m)≡1与循环小数的余数,属于“构造”的经典。实际上,循环小数的循环节长度问题还与著名的“大整数分解问题”有关。关于循环节长度的讨论,目前仅能就约数一一试验,而没有更好的办法,由于1/p(p为素数)的循环节长度难以找到规律。如果能够解决循环节长度问题,得出大数的约数,解决大数分解问题,RSA加密体制的安全性将受到极大挑战,并引起数论界的一次革命。

在计算机编程实现中,可利用同余性质。如楼上所说,类似动态规划的过程。另外我在命制数据时,考虑到时间问题,没有出结果很大的极限数据,选择的大数据使得对于较优的程序,即使把p不停地往上乘,也不会超时。

参考资料:数学竞赛《骗分导论》http://lbj.80.hk/

#7 lizhixin@2008-10-06 05:29:00
回复 删除
如果数据不大的话

可以先算出十进制的那个小数

然后把小数转K进制

然后判断

我试试去...

#8 DarkMaster@2008-10-06 05:48:00
回复 删除
LS乃朴素算法也....
查看更多回复
提交回复