3 条题解

  • 2
    @ 2024-9-29 8:24:39

    题解

    思路

    考虑直接构造。

    解题方法

    容易发现 nn 一定是某一段的最大值,故答案一定是 nn 的因数。

    如果 2m>n2m>n,则构造 n+12\dfrac{n+1}{2} 位置是 nn,其他位置乱填,此时任意一个区间必然包含 nn,答案为 nn

    其余情况至少有两个最大值不同的段,考虑现在 xx 的倍数只有 nx\dfrac{n}{x} 个,其中 xx 是答案。

    x>mx>m,则必有一段长为 mm 的段没有 xx 的倍数,故 xmx\leq m

    所以猜想此时答案是 mm 以下最大的 nn 的因数。

    考虑构造:x,1,...,x1,2x,x+1,...,2x1,3x,...x,1,...,x-1,2x,x+1,...,2x-1,3x,...

    然后就做完了。

    复杂度

    时间复杂度: O(Tn)O(Tn)

    空间复杂度: O(1)O(1)

    Code

    #include<bits/stdc++.h>
    using namespace std;
    int main(){
    	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    	int T;cin>>T;
    	while(T--){
    		int n,m;cin>>n>>m;
    		if(m*2>n){
    			int cnt=0;
    			for(int i=1;i<=n;++i)if(i==(n+1)/2)cout<<n<<" ";else cout<<(++cnt)<<" ";
    			cout<<'\n';
    			continue;
    		}
    		int T=1;
    		for(int i=m;i>=1;--i)if(n%i==0){T=i;break;}
    		int cnt=0;
    		for(int i=1;i<=n/T;++i){
    			cout<<T*i<<" ";++cnt;
    			for(int j=1;j<T&&cnt<n;++j)cout<<(i-1)*T+j<<" ",++cnt;
    		}
    		cout<<'\n';
    	}
    	return 0;
    }
    

    信息

    ID
    69
    时间
    3000ms
    内存
    512MiB
    难度
    5
    标签
    递交数
    446
    已通过
    92
    上传者