zoukankan      html  css  js  c++  java
  • [codeforces 317]A. Perfect Pair

    [codeforces 317]A. Perfect Pair

    试题描述

    Let us call a pair of integer numbers m-perfect, if at least one number in the pair is greater than or equal to m. Thus, the pairs (3, 3) and (0, 2) are 2-perfect while the pair (-1, 1) is not.

    Two integers xy are written on the blackboard. It is allowed to erase one of them and replace it with the sum of the numbers, (x + y).

    What is the minimum number of such operations one has to perform in order to make the given pair of integers m-perfect?

    输入

    Single line of the input contains three integers xy and m ( - 1018 ≤ xym ≤ 1018).

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

    输出

    Print the minimum number of operations or "-1" (without quotes), if it is impossible to transform the given pair to the m-perfect one.

    输入示例

    -1 4 15

    输出示例

    4

    数据规模及约定

    见“输入

    题解

    如果都是整数,那么不难发现增长率和斐波那契数列相同,就是指数级的,所以直接模拟即可。注意特判有负数的情况。如果只有一个负数,先把这个负数加成正的再模拟。如果两个都是负数,那么不可能再变大了。

    #include <iostream>
    #include <cstdio>
    #include <algorithm>
    #include <cmath>
    #include <stack>
    #include <vector>
    #include <queue>
    #include <cstring>
    #include <string>
    #include <map>
    #include <set>
    using namespace std;
    #define LL long long
    
    const int BufferSize = 1 << 16;
    char buffer[BufferSize], *Head, *Tail;
    inline char Getchar() {
        if(Head == Tail) {
            int l = fread(buffer, 1, BufferSize, stdin);
            Tail = (Head = buffer) + l;
        }
        return *Head++;
    }
    LL read() {
        LL x = 0, f = 1; char c = getchar();
        while(!isdigit(c)){ if(c == '-') f = -1; c = getchar(); }
        while(isdigit(c)){ x = x * 10 + c - '0'; c = getchar(); }
        return x * f;
    }
    
    LL x, y, m;
    
    int main() {
    	x = read(); y = read(); m = read();
    	
    	if(x > y) swap(x, y);
    	if(x <= 0 && y <= 0 && y < m) return puts("-1"), 0;
    	if(y >= m) return puts("0"), 0;
    	LL cnt = abs(x) % y ? abs(x) / y + 1 : abs(x) / y;
    	x += cnt * y; if(x > y) swap(x, y);
    	while(y < m) {
    		x = x + y;
    		if(x > y) swap(x, y);
    		cnt++;
    	}
    	
    	printf("%I64d
    ", cnt);
    	
    	return 0;
    }
    
  • 相关阅读:
    PCB设计实战项目指导班26层板的设计
    AT2171 [AGC007D] Shik and Game 题解
    UVA11327 Enumerating Rational Numbers 题解
    P6222 「P6156 简单题」加强版 题解
    CF702F TShirts 题解
    P3747 [六省联考 2017] 相逢是问候 题解
    『学习笔记』PollardRho 算法 题解
    P7453 [THUSCH2017] 大魔法师 题解
    CF1575L Longest Array Deconstruction 题解
    最大公约数之和
  • 原文地址:https://www.cnblogs.com/xiao-ju-ruo-xjr/p/5833781.html
Copyright © 2011-2022 走看看