CF1701B Permutation-题解

ZhanPJ 发布于 2022-07-10 42 次阅读


题目传送门:CF1701B

题目大意

你需要用数字 1 \sim n(每个数字不重复使用)构造出一个序列 P,并确定一个正整数 d。使得在序列 P 中,p_i \times d = p_{i+1} 的次数最多。
如果有多个解,输出任意一组即可,不要求 d 最大。

解题思路

这场比赛我跟着打的,然后这题害得我只做出来了两道题。

所需性质(证明读者易证):
- 性质 1p_i 所乘的 d 越小,p_i 的可能性越大。
-性质 2d固定取值d=2

解题:

我们通过上述的性质 2,我们已经确定了 d=2。那么接下来的步骤就是建立序列。

建立序列的时候考虑数字遍历的重复。因为我们枚举 p_i \times 2 的时候已经用掉了一些数字。那么在第一层大循环中,用掉的数字需要跳过,即建议一个数组储存数字的使用情况。

通过代码:

#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
bool vis[200005];
int main(){
    int T,n;
    scanf("%d",&T);
    while(T--){
        scanf("%d",&n);
        memset(vis,0,sizeof(vis));
        printf("2\n");
        for(int i=1;i<=n;i++){
            if(vis[i])continue;
            for(int j=i;j<=n;j*=2){
                printf("%d ",j);
                vis[j]=1;
            }
        }
        printf("\n");
    }

    return 0;
}