两数相除,判断小数位是否有限位

You are given several queries. Each query consists of three integers p, q and b. You need to answer whether the result of p/q in notation with base b

is a finite fraction.

A fraction in notation with base b

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

(1≤n≤105

) — the number of queries.

Next n

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

.

Output

For each question, in a separate line, print Finite if the fraction is finite and Infinite otherwise.

Examples

Input

Copy

26 12 104 3 10

Output

Copy

FiniteInfinite

Input

Copy

41 1 29 36 24 12 33 5 4

Output

Copy

FiniteFiniteFiniteInfinite

Note

612=12=0,510

43=1,(3)10

936=14=0,012

412=13=0,13

题意 : 给两个数,以及一个所要求的进制,询问是否在此进制下,相除后是否为有限位小数

思路分析 : 比赛的时候想了一个模拟,不过没有去写,旁边的大佬一直再和说,会超时,会超时,然后赛后才知道是用这样的,比如 10进制下,判断两数是否整除,只需要让除数已知除以 2 或者 5,当可以除到 1 的时候,代表是可以整除的,如果是换成任意进制下的一个数,则需要去除当前的数和 b进制的约数。

代码示例 :

#define ll long long

ll gcd(ll a, ll b){
    return b == 0?a:gcd(b, a%b);
}

int main() {
    //freopen("in.txt", "r", stdin);
    //freopen("out.txt", "w", stdout);
    ll t;
    ll p, q, b;

    cin >> t;
    while(t--){
        scanf("%lld%lld%lld", &p, &q, &b);
        ll g = gcd(p, q);
        ll x = q / g;
        ll f = gcd(b, x);

        while(1){
            if (f == 1) break;
            while(x%f == 0) x /= f;
            f = gcd(b, x);
        }
        if (x == 1) printf("Finite\n");
        else printf("Infinite\n");
    }
    return 0;
}

原文地址:https://www.cnblogs.com/ccut-ry/p/9047523.html

时间: 2024-10-08 16:33:15

两数相除,判断小数位是否有限位的相关文章

LeetCode 29两数相除

给定两个整数,被除数 dividend 和除数 divisor.将两数相除,要求不使用乘法.除法和 mod 运算符. 返回被除数 dividend 除以除数 divisor 得到的商. 示例 1: 输入: dividend = 10, divisor = 3 输出: 3 示例 2: 输入: dividend = 7, divisor = -3 输出: -2 说明: 被除数和除数均为 32 位有符号整数. 除数不为 0. 假设我们的环境只能存储 32 位有符号整数,其数值范围是 [?231, 23

每天AC系列(十三):两数相除

1 题目 LeetCode第29题,计算两数相除的商,不允许使用乘法,除法,求模运算符. 2 减法 首先判断结果是否需要加上负号,将商置为0后,被除数不断减去除数,同时商自增.最后根据是否有负号返回相应的商. boolean negative = true; if((dividend > 0 && divisor > 0) || (dividend < 0 && divisor < 0)) negative = false; dividend = d

[leetcode] 29. 两数相除

29. 两数相除 感觉是目前遇到过的最'难'过的题... 不让你用乘除法,看样子又是个涉及位运算的题. 上来打算暴力,只用减法,结果超时. 没啥想法,遂google了一下,发现可以用位运算左移操作,将divisor变大,直到divisor << 1 < dividend ,假设此时左移了k次,这时after_divisor = 2^k * origin_divisor.此时dividend再减去after_divisor,这不相当于重复了之前暴力算法中2^k次减法操作嘛. 之后可以重复寻

LeetCode 29 - 两数相除 - [位运算]

题目链接:https://leetcode-cn.com/problems/divide-two-integers/description/ 给定两个整数,被除数 dividend 和除数 divisor.将两数相除,要求不使用乘法.除法和 mod 运算符. 返回被除数 dividend 除以除数 divisor 得到的商. 示例 1: 输入: dividend = $10$, divisor = $3$输出: $3$ 示例 2: 输入: dividend = $7$, divisor = $-

Leetcode29题两数相除

题目 给定两个整数,被除数 dividend 和除数 divisor.将两数相除,要求不使用乘法.除法和 mod 运算符. 返回被除数 dividend 除以除数 divisor 得到的商. 示例一: 输入: dividend = 10, divisor = 3 输出: 3 示例二: 输入: dividend = 7, divisor = -3 输出: -2 说明: 1.被除数和除数均为 32 位有符号整数.2.除数不为 0.3.假设我们的环境只能存储 32 位有符号整数,其数值范围是 [−23

两数相除

给定两个 int 类型的数,不用乘法.除法和取模运算,计算他们的商. 输入格式 第一行依次输入被除数和除数,中间以空格间隔开. 输出格式 输出一个整数,表示它们的商. 样例输入 -1060849722 99958928 样例输出 -10 1 #include<bits/stdc++.h> 2 using namespace std; 3 int main(){ 4 int n,m; 5 while(cin>>n>>m){ 6 int flag=0; 7 if((n<

LeetCode 29——两数相除

1. 题目 2. 解答 2.1. 方法一 题目要求不能使用乘法.除法和除余运算,但我们可以将除法转移到对数域. $$ \frac{a}{b} = e^{\frac{lna}{lnb}} = e^{lna - lnb}$$ 这样就转化为指数.对数和减法运算了.因为只能对正整数取对数,因此我们首先要将两个数都取绝对值,最后再加上符号. 同时,题目要求只能存储 32 位有符号整数,因此,当数据大于上边界时,需要进行特殊处理. class Solution { public: int divide(in

LeetCode 29. 两数相除 时间击败【100.00%】 内存击败【76.25%】

不禁让我想起了计算机是怎样进行除法运算的,单独考虑溢出以及边界情况,单独考虑符号,其他过程和我们小学除法是一模一样的:左移除数(十进制就是扩大十倍,二进制扩大两倍),直到正好比被除数小,一边累加商(在我的代码里就是33行)一边减小被除数,直到被除数不能减小,右移除数,重复上述过程. 1 public int divide(int dividend, int divisor) { 2 if (dividend == Integer.MIN_VALUE && divisor == -1) re

利用随机数 求两数相减不退位

static void Main(string[] args)        {            while (true)            { int a, b, c,m,n;                Random r = new Random();  //主要的就是三位数的百分位最大不会同时取到四位数的百分位,也就是说c永远小于b;                a = r.Next(1,10);                b=r.Next(2, 10);