题目链接:点击打开链接
题目思路:根据等差数列的求和公式,枚举N,找到最小的a1即可
AC代码:
/*
2017年8月27日12:11:49
[Gym-100543C]
利用等差数列求和公式 枚举即可
AC
*/
#include <iostream>
#include <map>
#include <set>
#include <string>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <queue>
#include <vector>
using namespace std;
typedef long long ll;
const ll maxn=1e5;
void solve(ll sum){
ll a1,num;
bool f=true;
if((sum&(sum-1))==0){
printf("IMPOSSIBLE\n");
}
else{
for(ll i=2;i<=sum;i++){
//if(i&1) tmp=
/*利用等差数列的性质枚举n,找到第一个成立的a1为止*/
ll tmp=(i*(i-1)/2);
if((sum-tmp)%i==0){
a1=(sum-tmp)/i;
num=i;
f=false;
break;
}
}
if(a1<1||f) printf("IMPOSSIBLE\n");
else{
printf("%I64d = %I64d",sum,a1);
for(ll i=1;i<num;i++){
if(i!=(num-1))
printf(" + %I64d",a1+i);
else
printf(" + %I64d\n",a1+i);
}
}
}
}
int main(){
int t;
scanf("%d",&t);
while(t--){
ll n;
scanf("%I64d",&n);
solve(n);
}
return 0;
}