http://acm.hdu.edu.cn/showproblem.php?pid=4982

就当构造题来写了。。

#include<cstdio>

int n, k;

bool ok()
{
    int i = 1, t;
    while (i * i < k * (k - 1) / 2) ++i;
    for (; i * i < n; ++i)
    {
        t = n - i * i;
        if (t > k) return true; // 此时增大倒数第二个,若和t一样,则倒数第二个-1,倒数第三个+1
        if (t < k)
        {
            if (k * (k + 1) / 2 <= n) return true; // 此时增大最后一个即可
        }
        else
        {
            if (n != k * (k + 1) / 2 + 1) return true; // 如果 n == k * (k + 1) / 2 + 1,那是令人绝望的。。
        }
    }
    return false;
}

int main()
{
    while (~scanf("%d%d", &n, &k)) puts(ok() ? "YES" : "NO");
    return 0;
}

Comments

comments powered by Disqus