The ? 1 ? 2 ? ... ? n = k problem
The ? 1 ? 2 ? ... ? n = k problem |
The problem
Given the following formula, one can set operators '+' or '-' instead of each '?', in order to obtain a given k
? 1 ? 2 ? ... ? n = k
For example: to obtain k = 12 , the expression to be used will be:
- 1 + 2 + 3 + 4 + 5 + 6 - 7 = 12
with n = 7
The Input
The first line is the number of test cases, followed by a blank line.
Each test case of the input contains integer k (0<=|k|<=1000000000).
Each test case will be separated by a single line.
The Output
For each test case, your program should print the minimal possible n (1<=n) to obtain k with the above formula.
Print a blank line between the outputs for two consecutive test cases.
Sample Input
2 12 -3646397
Sample Output
7 2701
Alex Gevak
September 15, 2000 (Revised 4-10-00, Antonio Sanchez)
=================================
给你一个整数k,问你至少需要多少个从1开始的连续整数(加减都可以)得到k(k的正负不影响结果,可以把所有的正负调换结果相同)
先预处理一下,把从1开始到i的连续整数和保存在sum[i]里,现在所有整数前面的符号都为正。对于输入的k,如果sum[i]-k为偶数的话,则一定可以在连续整数中找到一个数把前面的符号改为负,使sum结果等于k(若sum[i]-k=0,则符号均为正即可),输出i;如果sum[i]-k为奇数则i++直到sum[i]-k为偶数输出i即可
#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
int sum[55555]={0},p,n;
int main()
{
for(int i=1;sum[i-1]<1000000000;i++)
{
sum[i]=sum[i-1]+i;
}
int t;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
if(n==0)
{
printf("3\n");
if(t) printf("\n");
continue;
}
if(n<0) n=fabs(n);
for(int i=0;;i++)
{
if(sum[i]>=n)
{
p=i;
break;
}
}
if((n-sum[p])%2==0) printf("%d\n",p);
else
{
p++;
while((n-sum[p])%2)
{
p++;
}
printf("%d\n",p);
}
if(t) printf("\n");
}
return 0;
}