983A Finite or not?

版权声明:大家一起学习,欢迎转载,转载请注明出处。若有问题,欢迎纠正! https://blog.csdn.net/memory_qianxiao/article/details/80351132

A. Finite or not?
time limit per test
1 second
memory limit per test
256 megabytes
input
standard input
output
standard output

You are given several queries. Each query consists of three integers ppqq 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 nn (1n1051≤n≤105) — the number of queries.

Next nn lines contain queries, one per line. Each line contains three integers ppqq, and bb (0p10180≤p≤10181q10181≤q≤10182b10182≤b≤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 Infiniteotherwise.

Examples
input
Copy
2
6 12 10
4 3 10
output
Copy
Finite
Infinite
input
Copy
4
1 1 2
9 36 2
4 12 3
3 5 4
output
Copy
Finite
Finite
Finite
Infinite
Note

612=12=0,510612=12=0,510

43=1,(3)1043=1,(3)10

936=14=0,012936=14=0,012

412=13=0,13412=13=0,13


题意:判断一个分数在某一进制下是否为无限小数。

题解:首先把这个分数约分,然后便是判断。,一个分数是否为无限小数,与分子是无关的,只与分母有关。然后,再来看看10进制的分数,可化为有限小数的特点,10为分母可以,2为分母可以,16为分母可以,40为分母可以。。。。
总之,其实全部都与2和5有关,2和5又是10的质因数,所以可以猜想到,如果分母可以分解为进制的质因子的乘积,那么就可以化为有限小数。所以,就判断q的质因子是否为b的子集
每次求出q与b的最大公约数g,那么g必须可以全部包含q的质因子,所以q /= g,b = g,然后一直这样做,直到g为1,最后再判断q能否整除b。参考别人博客后,这个题卡cin,cout,如果用scanf,printf就能过。如果非要用cin就要加  ios::sync_with_stdio(0)在cin,cout流前面,取消与stdio的同步,也能和scanf和printf一样的效率。给出三种写法,c的两种,python的一种直接无视大数据,python大法好啊。
代码一:
#include<bits/stdc++.h>
using namespace std;
int main()
{
    long long p,q,b,n,x;
    ios::sync_with_stdio(0);///取消与stdio同步,减少cin输出缓冲时间消耗,效率与scanf和printf差不多
    cin>>n;
    while(n--)
    {
        cin>>p>>q>>b;
        q/=__gcd(p,q);///分母约分
        x=__gcd(q,b);
        while(x!=1)
        {
            q/=x;
            x=__gcd(q,b);
            b=x;
        }
        if(x%q) puts("Infinite");
        else puts("Finite");
    }
    return 0;
}

代码二:

#include<bits/stdc++.h>
using namespace std;
int main()
{
    long long n,p,q,b,x;
    scanf("%I64d",&n);
    while(n--)
    {
        scanf("%I64d%I64d%I64d",&p,&q,&b);
        q/=__gcd(p,q);
        x=__gcd(q,b);
        while(x!=1)
        {
            q/=x;
            x=__gcd(q,b);
            b=x;
        }
        if(x%q) puts("Infinite");
        else puts("Finite");
    }
    return 0;
}


代码三:

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)








阅读更多

扫码向博主提问

Memory丿浅笑

非学,无以致疑;非问,无以广识
  • 擅长领域:
  • python
  • c++
  • 爬虫
去开通我的Chat快问
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页