QOJ.ac

QOJ

Type: Editorial

Status: Open

Posted by: tangzirui1016

Posted at: 2026-09-14 21:59:20

Last updated: 2026-09-14 22:37:20

Back to Problem

神秘常数 $520520$

首先也是先想到题解的 $\frac{2n}{3}$ 做法,就是找到一个 $a+b=c$,那么每次可以把 $c$ 替换成 $a+b$,以至于每次多出一个。但是由于我们没用充分利用替换后的 $a,b$,它们替换之后就没有任何作用了。

所以考虑一种这种递归形状:

这种结构利用了 $2n-1$ 个元素,实现了 $n-2$ 层递归,然后在开头加一个 $1+2+3+4+7+9-10=16$ 就可以刚好利用 $2n$ 个元素凑成刚好 $n-1$ 层。

同时需要满足剩下的那个元素不能和之前的元素相同,而且开始递归的数要足够大,并且要保证最后减出来的数要不超过 $10^9$。,大概是根号级别的,打一下表发现 $520520$ 这个数就满足条件。

然后注意 $n\le 3$ 的时候要特判一下。构造是线性的。

然后就有:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int num=520520,n; 
ll sum;
vector<int>ans,tmp;
unordered_map<int,bool>mp;
int main(){
    cin>>n;
    if(n==2) cout<<"1 2 3 4\n1\n2 1 4\n2 2 3\n";
    else if(n==3) cout<<"5 2 4 3 1 7\n2\n2 7 4\n4 1 3 2 5\n4 1 3 2 5\n2 7 4\n"; 
    else{
        int now=1,x=num;
        for(int i=1;i<n;i++){
            sum+=x;
            x-=now; 
            ans.push_back(x);
            ans.push_back(now);
            now++;
        }
        ans.push_back(num);
        ans.push_back(sum-num);
        for(int v:ans) cout<<v<<' ';
        cout<<'\n';
        cout<<n-1<<'\n';
        tmp.push_back(sum-num);
        tmp.push_back(num);
        now=1;
        for(int i=2;i<=n;i++){
            cout<<i<<' ';
            for(int v:tmp) cout<<v<<' ';
            cout<<'\n';
            mp.clear();
            for(int v:tmp) mp[v]=1;
            cout<<2*n-i<<' ';
            for(int v:ans){
                if(!mp.count(v)) cout<<v<<' ';
            }
            cout<<'\n';
            if(i==n) break;
            int x=tmp.back(); 
            tmp.pop_back();
            tmp.push_back(now),tmp.push_back(x-now);
            now++;
        }
    }
    return 0;
}

Comments

No comments yet.