#P4759 [CERC2014]Sums
可以将和的形式看作一个等差数列求和
s=(a1+an)n/2 将an=a1+(n-1)d换掉即可得出2s=(2a1+n-1)*n
此时枚举n即可得到一个合法的a1即时答案,因为n从小数枚举故而枚举到的第一个答案一定是最大值
#include<bits/stdc++.h>
using namespace std;
const int N=1e9+10;
long long s,n;
int main(){
cin>>s;
while(s--){
bool flag=1;
cin>>n;
for(int i=2;i*i<=2*n;i++){//因为(2*s=(2*a1+n-1)*n)故而n*n<2*s
if(n*2%i!=0)continue;//若不能整除 必然无解
if(((n*2)/i-i+1)%2==0){
flag=0;
int x=((n*2)/i-i+1)/2;//首项
int y=x+i-1;//末项
cout<<n<<" = ";
for(int j=x;j<x+i-1;j++)
cout<<j<<" + ";
cout<<y<<endl;
break;
}
}
if(flag)cout<<"IMPOSSIBLE"<<endl;
}
return 0;
}
参考:https://www.luogu.com.cn/problem/solution/P4759