Codeforces Round #121 (Div. 2) A Funky Numbers

問題概要

問題文
整数Nが与えられる。

Nが2つの三角数の和ならば"YES"、
そうでないならば、"NO"と出力せよ。

三角数について:wikipedia:三角数

解き方

三角数kについて、(√(8(N-k)+1)-1)/2が
正の整数となるとき、N-kは三角数になる。

1≦k≦Nの範囲でN-kが三角数になればYES、
ならないならばNOを返せばよい。

※8(N-k)のオーバーフローに注意すること

ソースコード

#include <cmath>
#include <iostream>
using namespace std;

int main ()
{
    int n;
    cin>>n;
    int k=1;
    while (k*(k+1)/2<=n) {
        long long int t=n-k*(k+1)/2;
        double a=(sqrt(8*t+1)-1)/2;
        if (a==(int)a&&a>0) {
            cout<<"YES"<<endl;
            return 0;
        }
        k++;
    }
    cout<<"NO"<<endl;
    return 0;
}