AtCoder K2PC Hard C お気に入りの数2
http://k2pc-hard.contest.atcoder.jp/tasks/k2pc001_h3
回答
greedyに、大きい数のsqrtの道を辿ってく。
nが平方数じゃないなら-1、n<=2なら0
コメント
今見ると不要な場合分けがあるようだ。
この問題のwriterいわく、違う方法(根本的な解き方は同じように見えるが)の比較的複雑なものがwriter解のようだ。
https://twitter.com/kyuridenamida/status/236458452313063424
コード
#include <string> #include <vector> #include <algorithm> #include <set> #include <map> #include <queue> #include <iostream> #include <sstream> #include <cstdio> #include <cmath> #include <ctime> #include <cstring> #define rep(i,n) for(int (i)=0;(i)<(int)(n);++(i)) #define rer(i,l,u) for(int (i)=(int)(l);(i)<=(int)(u);++(i)) #define reu(i,l,u) for(int (i)=(int)(l);(i)<(int)(u);++(i)) #ifdef _MSC_VER #define aut(v, x) auto v = x #else #define aut(v, x) __typeof(x) v = (x) #endif #define each(it,o) for(aut(it, (o).begin()); it != (o).end(); ++ it) #define all(o) (o).begin(), (o).end() #define pb(x) push_back(x) #define mp(x,y) make_pair((x),(y)) #define mset(m,v) memset(m,v,sizeof(m)) using namespace std; typedef long long ll; typedef vector<int> vi; typedef pair<int,int> pii; typedef vector<pii> vpii; const int INF = 0x3f3f3f3f; const ll INFL = 0x3f3f3f3f3f3f3f3fLL; int main() { ll n; ll r = 0; vector<ll>v; scanf("%lld",&n); if(n<=2){r = 0;} else if(n==4){r = 3;} else if(n<=8){r = -1;} else { ll i; for(i = 2; i*i <= n; i ++) { v.pb(i*i); } if((i-1)*(i-1)!=n) r = -1; else { r = 0; ll c = 2; for(i = v.size()-1; i >= 0; -- i) { r += (v[i] - c) + 1; c = i+2; } } } cout << r << endl; return 0; }