因为sum是一个等差数列,因此N=(a+b)(b-a+1)/2. Set m=b-a+1, 2N=(a+b)m。因为N,m,a+b都是整数且m>=2,所以m即为2N的factor,所以只需枚举所有的factor m,判断是否存在a即可, 2a=(2N/m)+1-m.
#include<iostream>
#include<stdlib.h>
#include<cstdio>
#include<vector>
#include<algorithm>
#include<cmath>
using namespace std;
const int maxn=1e9+10;
int T;
int N;
vector<int>fac;
void findfac()
{
int upp=2*N;
// cout<<"upp: "<<sqrt(upp)+1<<endl;
for(int i=2;i<sqrt(upp)+1;i++)
{
if(upp%i==0)
{
fac.push_back(i);
int tmp=upp/i;
if(tmp!=i)
{
fac.push_back(tmp);
}
}
}
}
int main()
{
// freopen("input.txt","r",stdin);
scanf("%d",&T);
for(int ca=1;ca<=T;ca++)
{
scanf("%d",&N);
fac.clear();
if(N==1)
{
printf("IMPOSSIBLE\n");
continue;
}
else if(N==2)
{
printf("IMPOSSIBLE\n");
continue;
}
findfac();
sort(fac.begin(),fac.end());
bool flg=false;
for(int i=0;i<fac.size();i++)
{
int m=fac[i];
// cout<<m<<endl;
int doua=2*N/m+1-m;
if(doua%2==0)
{
doua=doua/2;
flg=true;
printf("%d = ",N);
for(int j=0;j<m;j++)
{
printf("%d",doua+j);
if(j!=m-1)
{
printf(" + ");
}
}
printf("\n");
break;
}
}
if(flg==false)
{
printf("IMPOSSIBLE\n");
}
}
return 0;
}