假設數列共有 x+1項

首項 = 1

末項 = mx+1

 

=> S = (1+mx+1)*(x+1) / 2 = 2n

=> mx^2 + (m+2)x = 2n-2

 

若用公式解,平方部分會overflow

 

故,此處採用二分搜尋法,搜尋x的值

 

#include <iostream>
#include <cmath>

using namespace std;

 

 

int main()
{
    long long int n, m, right, left;
    int up, down, i;
    bool success;

    while(cin >> n >> m)
    {
        if(m == 0 || n == 0 || n == 1)
        {
            cout << "Go Kevin!!" << endl;
            continue;
        }

        success = false;

        right = 2*n-2;
        i = down = 1;
        while(m*(i-1)*(i-1)+(m+2)*(i-1) < right)
            i*=10;

        if(m*(i-1)*(i-1)+(m+2)*(i-1) == right)
            success = true;

        up = i;
        down = i/10;

        while(up - down > 1)
        {
            i = (up + down) / 2;
            left = m*(i-1)*(i-1)+(m+2)*(i-1);

            if(left == right)
            {
                success = true;
                break;
            }
            else if(left < right)
                down = i;
            else
                up = i;

        }

        if(success)
            cout << "Go Kevin!!" << endl;
        else
            cout << "No Stop!!" << endl;

    }
}

 
arrow
arrow
    全站熱搜

    大神(偽) 發表在 痞客邦 留言(0) 人氣()