假設數列共有 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;
}
}