Description
定义一个序列是好的当且仅当它可以被表示成一个序列复制一倍后拼接,例如:aaaa,abab,abcabc
给定一个n,要求构造一个序列s满足
- |s|<=200
- s中含有恰好n个好的子序列
- s中的元素∈[1,100]
n ≤ 1 0 12 n\le 10^{12} n≤1012
Solution
一般的构造考虑两个方向,拆成若干段不干扰然后拼接,或者考虑倍增得到它
可以发现aXaY恰好是XY的两倍,而aXYa恰好比XY多1,其中a是XY中没出现过的任意元素
我们利用这个性质就可以logn倍增这个东西了
Code
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <queue>
#define rep(i,st,ed) for (int i=st;i<=ed;++i)
typedef long long LL;
const int N=20005;
int tot;
std:: deque <int> L,R;
void solve(LL n) {
if (n==1) return ;
solve(n/2);
L.push_front(++tot);
R.push_front(tot);
if (n&1) {
L.push_front(++tot);
R.push_back(tot);
}
}
int main(void) {
LL n; scanf("%lld",&n);
solve(n+1);
printf("%d\n", L.size()+R.size());
for (int i=0;i<L.size();++i) printf("%d ", L[i]);
for (int i=0;i<R.size();++i) printf("%d ", R[i]);
puts("");
return 0;
}