思路:
枚举这个等差序列的长度。
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <vector>
#include <map>
using namespace std;
const int maxn = 1e6 + 7;
map<int,pair<int,int>>mp;
void Print(int n,int x,int y) { //初始值x,长度y
printf("%d = ",n);
for(int i = 1;i < y;i++) {
printf("%d + ",x);
x++;
}
printf("%d\n",x);
}
int main() {
int T;scanf("%d",&T);
while(T--) {
int sum = 1;
int n;scanf("%d",&n);
if(n == 1) {
printf("IMPOSSIBLE\n");
continue;
}
if(mp[n].first) {
if(mp[n].first == -1) {
printf("IMPOSSIBLE\n");
continue;
}
else {
Print(n,mp[n].first,mp[n].second);
continue;
}
}
int num = sqrt(n) * 2;
for(int i = 2;i <= num;i++) {
sum += i;
if((n - sum) % i == 0) {
mp[n].first = 1 + (n - sum) / i;
mp[n].second = i;
Print(n,mp[n].first,mp[n].second);
break;
}
}
if(mp[n].first == 0) {
printf("IMPOSSIBLE\n");
mp[n].first = -1;
mp[n].second = -1;
}
}
return 0;
}