去年合肥网络赛的题目,今天终于给搞定了。确切的说不是完全独立想出来的,看了网上的一点提示(用欧拉定理),然后想了好几次终于想出来了。
题目大意是给定一个L(L不大于2000000000),求最小长度的能整除L的都是8的数,输出长度,如果没有输出0。设长度为n的话,那么这个全为8的数可以表示成8 + 80 + 800 + ...是一个等比数列,变换后得到8 * (10 ^ n - 1) / 9 = k * L。如果L中2的因子数不大于3个,那么可以除掉。之后等式可以写成10 ^ n - 1 = 9 * k * L,也就可以转换成一个模方程:10 ^ n = 1 mod 9L。根据欧拉定理,一定要10和9 * L互素才能有解,这样就可以判定出无解的情况了。之后相当于求一个原根,求出9L的欧拉函数,设其为phi,那么n一定是phi的约数才可以满足条件,枚举phi的约数就可以了。
这个题目变态的一个地方在于9L和phi都可能很大,int表示不下,要用long long,这么大的模简单的乘法会溢出,也要写成二分的形式。中间有好几个地方我都用了int,结果导致溢出,超时了2次。总的来说这是个很好的数论题目,以后这种题目应该多练习一些。
posted on 2009-06-10 09:16
sdfond 阅读(289)
评论(0) 编辑 收藏 引用 所属分类:
Algorithm - Number Theory