• CF 305B——Continued Fractions——————【数学技巧】


    B. Continued Fractions
    time limit per test
    2 seconds
    memory limit per test
    256 megabytes
    input
    standard input
    output
    standard output

    A continued fraction of height n is a fraction of form . You are given two rational numbers, one is represented as  and the other one is represented as a finite fraction of height n. Check if they are equal.

    Input

    The first line contains two space-separated integers p, q (1 ≤ q ≤ p ≤ 1018) — the numerator and the denominator of the first fraction.

    The second line contains integer n (1 ≤ n ≤ 90) — the height of the second fraction. The third line contains n space-separated integers a1, a2, ..., an (1 ≤ ai ≤ 1018) — the continued fraction.

    Please, do not use the %lld specifier to read or write 64-bit integers in С++. It is preferred to use the cin, cout streams or the %I64d specifier.

    Output

    Print "YES" if these fractions are equal and "NO" otherwise.

    Sample test(s)
    input
    9 4
    2
    2 4
    output
    YES
    input
    9 4
    3
    2 3 1
    output
    YES
    input
    9 4
    3
    1 2 4
    output
    NO
    Note

    In the first sample .

    In the second sample .

    In the third sample .

    题目大意:判断两个式子是不是相等。

    解题思路:p=q*a+r(a表示商,r表示余数)。则可以每次判断p-q*ai(相当于ai后边的分式的结果)的值是否小于0,如果小于0,说明肯定是不等的;如果大于0,将q当做p,将(p-q*ai)当做q(p、q的转变,表示将后边的一串分式取倒数)重复上边的过程。

    #include<bits/stdc++.h>
    using namespace std;
    #define LL long long
    LL a[100];
    LL gcd(LL a,LL b){
        return b?gcd(b,a%b):a;
    }
    int main(){
        LL p,q,tm;
        int n,i,j,k;
        while(scanf("%I64d%I64d",&p,&q)!=EOF){
    
            scanf("%d",&n);
            bool flag=0;
            for(i=0;i<n;i++){
                scanf("%I64d",&a[i]);
                if(flag==1){
                    continue;
                }
                if(p/q<a[i]){
                    flag=1;
                    continue;
                }
                tm=q;
                q=p-q*a[i];
                if(q<=0&&i!=n-1){
                    flag=1;
                    continue;
                }
                p=tm;
                tm=gcd(p,q);
                p/=tm;
                q/=tm;
            }
            if(q>0)
                flag=1;
            if(flag==1){
                printf("NO
    ");
            }else{
                printf("YES
    ");
            }
        }
        return 0;
    }
    

      

  • 相关阅读:
    正则 不匹配某个单词
    希赛 系统架构设计师教程 勘误
    QQ 快速登录中获取用户信息
    requests 配置tor代理后提示'Failed to establish a new connection: [Errno -2] Name or service not known'
    xadmin choice filter 多选
    kali linux 热点 无法获取IP
    windows10 输入法添加小鹤双拼
    del: recycle for linux
    安装WSL2
    cmake(转载)
  • 原文地址:https://www.cnblogs.com/chengsheng/p/4540316.html
Copyright © 2020-2023  润新知