题目链接:https://codeforc.es/contest/1701/problem/B

大意是:给出一个数n,让我们制作一个关于1-n的排列,我们需要制作一个p,使得a[i]=a[i-1]*p的数量是最多的。

div2的思维题,题很简单,但是刚开始理解错了意思。后面做题的时候又是各种小错误,刚开始是不敢开循环,因为只有1s,怕tle,之后就是逻辑判断上的错误,最后还有一个数据范围的错误。所有错误前前后后wa了10+次。

最刚开始的思路是有问题的,我从素数入了手,去做每个相关联数的首项,因为这样的一个范围是很小的。没开暴力循环。但是这个题就是外循环开暴力,查看哪个数没有被打印过,然后去打印它。我真的服了,我很怕被tle。

解决方法:通过观察易得p等于2,从1-n进行遍历,遇到没有输出过的数就标记并输出它,并标记输出它的p倍数直到i*指数递增超过了n。
对于第二个区域的数,也就是从前面那个区域断开了的数,我们继续上面方法。直到最后将所有数标记并输出完。

code:

#include<bits/stdc++.h>
using namespace std;
const int nn = 2*1e5+10;
bool sign[nn];
int main()
{
	int t;
	cin>>t;
	while(t--)
	{
		memset(sign,false,sizeof sign);
		int n;
		scanf("%d",&n);
		printf("2\n");
		for(int i=1;i<=n;i++){
			if(!sign[i])
			{
				int a= i;
				while(a<=n)
					if(!sign[a]) { printf("%d ",a);sign[a]=true;a*=2;}
					else 	break;
			}
		}
		printf("\n");
	}
}