BOJ::10504 덧셈

시사점

이해(x)

설계, 손 코딩(x)

복잡도

구현(x)

// https://beenpow.github.io/
#include<bits/stdc++.h>
#define endl '\n'
#define pb push_back
//#define f first
//#define s second
#define all(v) (v).begin(), (v).end()
#define rep(i,a,b) for(int i=a;i<b;i++)
#define r_rep(i,a,b) for(int i=a;i>b;i--)
#define vi vector<int>
#define vll vector<ll>
#define vpi vector<pair<int, int> >
#define vpll vector<pair<ll, ll> >
typedef long long ll;
using namespace std;
#define MOD 1000000007

ll n;
vll ans;
void PRINT(){
    if(ans.size() == 0){
        cout << "IMPOSSIBLE" << endl;
    }else{
        cout << n << " = " << ans[0];
        rep(i, 1, ans.size()){
            cout << " + " << ans[i];
        }
        cout << endl;
    }
}
void process(){
    ans.clear();
    cin >> n;
    vll dvrs;
    ll n2 = 2 * n;
    for(int i = 2; i * i <= n2; i++){
        if( n2 % i == 0){
            dvrs.push_back(i);
            if(i != n2/i) dvrs.push_back(n2/i);
        }
    }
    sort(all(dvrs));
    bool f = false;
    for(int i = 1; i < 32; i++){
        if((1LL << i) == n) f = true;
    }
    if(!f){
        rep(i, 0, dvrs.size()){
            ll d = dvrs[i];
            ll q = (2 * n ) / d;
            ll r = (2 * n ) % d;
            if(r > 0) continue;
            ll k = q - d + 1;
            if(q > 0 && (k%2 == 0)){
                k /= 2;
                for(ll j = k; j < k + d; j++)
                ans.push_back(j);
                break;
            }
        }
    }
    PRINT();
}

int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(0); cout.tie(0);
    int tc; cin >> tc;
    while(tc--)
        process();
    return 0;
}

디버깅(x)

좋은 코드

최적화