题目传送门:CF1701B
题目大意
你需要用数字 1 \sim n(每个数字不重复使用)构造出一个序列 P,并确定一个正整数 d。使得在序列 P 中,p_i \times d = p_{i+1} 的次数最多。
如果有多个解,输出任意一组即可,不要求 d 最大。
解题思路
这场比赛我跟着打的,然后这题害得我只做出来了两道题。
所需性质(证明读者易证):
- 性质 1:p_i 所乘的 d 越小,p_i
-性质 2:d 的固定取值为 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;
}
Comments NOTHING