Jagiellonian University
Kraków
ACM ICPC
Central Europe Regional Contest 2014
Problem C: Sums
Given an integer
푁
, express it as the sum of at least two consecutive positive integers. For
example:
•
10 = 1 + 2 + 3 + 4
•
24 = 7 + 8 + 9
If there are multiple solutions, output the one with the smallest possible number of summands.
Input
The first line of input contains the number of test cases
푇
. The descriptions of the test cases
follow:
Each test case consists of one line containing an integer
푁
(
1
¬
푁
¬
10
9
).
Output
For each test case, output a single line containing the equation in the format:
N = a + (a+1) + … + b
as in the example. If there is no solution, output a single word
IMPOSSIBLE
instead.
Example
For an example input
the correct answer is:
3
8
10
24
IMPOSSIBLE
10 = 1 + 2 + 3 + 4
24 = 7 + 8 + 9
思路:n=(b-a+1) * (a+b)/2,一个差为1的等差数列。令m=b-a+1,则m>=2。2*n=m*(a+b),找是否存在一个2*n的因数m,使2*a=2*n/m+1-m;
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
typedef long long ll;
int a[10005];
ll k;
int judge(int m)
{
int x;
int y,j;
x=2*k/m+1-m;
if(x%2==0)
{
x/=2;
printf("%lld = ",k);
y=m+x-1;
for(j=x; j<y; j++)
{
printf("%d + ",j);
}
printf("%d\n",y);
return 1;
}
else
return 0;
}
int main()
{
int i,t;
scanf("%d",&t);
while(t--)
{
scanf("%lld",&k);
if(k==1||k==2)
printf("IMPOSSIBLE\n");
else
{
double kk;
kk=1.0*2*k;
int r=sqrt(kk)+1;
int flag=0;
for(i=2; i<r; i++)
{
if((2*k)%i==0)
{
flag=judge(i);
if(flag==1)
break;
if((2*k)/i!=i)
judge(2*k/i);
if(flag==1)
break;
}
}
if(!flag)
printf("IMPOSSIBLE\n");
}
}
return 0;
}