博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
codeforces 983A Finite or not?判断进制有限表示
阅读量:4659 次
发布时间:2019-06-09

本文共 1463 字,大约阅读时间需要 4 分钟。

给你一个分子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,防止爆炸。

转载于:https://www.cnblogs.com/waldenlake/p/9044881.html

你可能感兴趣的文章
多媒体音量条显示异常跳动
查看>>
运算符及题目(2017.1.8)
查看>>
ssh自动分发密匙脚本样板
查看>>
转 小辉_Ray CORS(跨域资源共享)
查看>>
Linux安装postgresql
查看>>
MyBatis启动:MapperStatement创建
查看>>
【 全干货 】5 分钟带你看懂 Docker !
查看>>
[转]优化Flash性能
查看>>
popStar手机游戏机机对战程序
查看>>
lambda表达式树
查看>>
二次注入原理及防御
查看>>
会话记住已登录功能
查看>>
Linux内核分析——可执行程序的装载
查看>>
第一阶段冲刺3
查看>>
父类引用指向子类对象
查看>>
网页如何实现下载功能
查看>>
IT男专用表白程序
查看>>
读《大道至简》第六章感想
查看>>
ef linq 中判断实体中是否包含某集合
查看>>
章三 链表
查看>>