Codeforces 984C. Finite or not?

题意:给了两个数p,q和一个进制数b,问p/q在b进制下是否是有限小数

分析:首先对p/q约分,将十进制分数转化为b进制数就是不断乘以b,小数点后依次加上整数部分,如果是有限小数,肯定是最后可以乘到一个数能整除q。但是对于p直接乘以b的话会爆long long 的,这里用到一个trick,就是乘以b最后能整除q的话,其实就看每次乘以b之后会不会产生大于1的b与q的公约数,q的因子就不断被约掉了,直到公约数为1为止。

代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll gcd(ll a,ll b)
{
    if(b == 0)return a;
    else return gcd(b,a % b);
}

int main()
{
    ll n,p,q,b;
    cin>>n;
    for(int i = 1; i <= n; i++)
    {
        scanf("%I64d%I64d%I64d",&p,&q,&b);
        ll x = gcd(p,q);
        q /= x;
        while(q != 1)
        {
            ll s = gcd(q,b);
            if(s == 1)break;
            while(q % s == 0)
                q /= s;
        }
        if(q == 1)printf("Finite\n");
        else printf("Infinite\n");
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/zhlbjtu2016/article/details/81317435
今日推荐