又是简单的递推。
#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;
}