http://codeforces.com/problemset/problem/983/A
给你一个分子p,一个分母q,一个进制base:b。问b进制下,该分数是不是有限小数。
You are given several queries. Each query consists of three integers pp, qq and bb. You need to answer whether the result of p/qp/q in notation with base bb is a finite fraction.
A fraction in notation with base bb is finite if it contains finite number of numerals after the decimal point. It is also possible that a fraction has zero numerals after the decimal point.
The first line contains a single integer n (1≤n≤105) — the number of queries.
Next nn lines contain queries, one per line. Each line contains three integers pp, qq, and bb (0≤p≤1018, 1≤q≤1018, 2≤b≤1018). All numbers are given in notation with base 1010.
For each question, in a separate line, print Finite if the fraction is finite and Infinite otherwise.
首先有个错误想法是,必须分子分母整除一下,才能有效使用分母,然后分母的所有因子必须都能整除进制b。
比如分子分母互质之后的数是50,有2,5两个因子,那么b必须要是2*5=10的倍数才行。
道理是这么个道理,如何快速实现成才是卡住我的问题。
首先,分解因子是不可能的了,时间复杂度O(n^0.5),然后我想到的是求gcd,不断用分母除以gcd(q,b),这样不断求gcd代价也高。
这类题目几乎都是最后的数学实现是极度化简的,答案:
n=int(input())
s=''
for i in range(n):
p,q,b=map(int,input().split())
for i in range(6):
b=(b*b)%q
if((p*b)%q):
s+='Infinite\n'
else:
s+='Finite\n'
print(s)
一般会有个取模的过程,谁做为模?分母q
谁去取模?p*b^x,这里面x需要任意,也就是说存在一个很大的x,使取模运算为0,那么就是finite的。
那么x的上限是多少?10^18约等于2^60,就是说b在小于10^18的情况下,b中的最小因子2顶多重复60遍,其他因子会更少,所以60是一个安全的上界。
所以要循环60次求出2^60?
快速幂登场,每次都把b平方一下,6次就到64了。
因为最后要模q,所以可以中途mo,防止爆炸。
来源:oschina
链接:https://my.oschina.net/u/4347910/blog/3972097