C - Sums Gym - 100543C

在这里插入图片描述

思路:
枚举这个等差序列的长度。

#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;
}
原创文章 930 获赞 38 访问量 5万+

猜你喜欢

转载自blog.csdn.net/tomjobs/article/details/106063782