又是简单的递推。
#include <iostream> using namespace std; const int kMax = 500001; int list[kMax]; bool Find[3500000]; void makeList() { int i; list[0] = 0; Find[0] = true; for(i = 1; i < kMax; i++) { int tmp = list[i-1]-i; if(tmp > 0 && !Find[tmp]) list[i] = tmp; else list[i] = list[i-1] + i; Find[list[i]] = true; } } int main() { int k; memset(Find, false, sizeof(Find)); makeList(); while(scanf("%d", &k) == 1) { if(k == -1) break; printf("%d\n", list[k]); } return 0; }