Gym

来源:互联网 发布:吐槽王pi知乎 编辑:程序博客网 时间:2024/05/03 23:01

题目链接:点击打开链接

题目思路:根据等差数列的求和公式,枚举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);elseprintf(" + %I64d\n",a1+i);} }}}int main(){int t;scanf("%d",&t);while(t--){ll n;scanf("%I64d",&n);solve(n);} return 0;}