codeforces 983A Finite or not?判断进制有限表示

和自甴很熟 提交于 2020-12-04 01:51:25

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.

Input

The first line contains a single integer n (1n≤105) — the number of queries.

Next nn lines contain queries, one per line. Each line contains three integers pp, qq, and bb (0p≤1018, 1q≤1018, 2b≤1018). All numbers are given in notation with base 1010.

Output

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,防止爆炸。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!