首页 > 其他分享 >Codeforces Round 893 (Div. 2) C. Yet Another Permutation Problem

Codeforces Round 893 (Div. 2) C. Yet Another Permutation Problem

时间:2023-10-17 22:13:45浏览次数:43  
标签:lfloor 排列 frac gcd int Codeforces 893 数组 Problem

有一个 \(gcd\) 游戏,按以下步骤进行:

  • 选择一个 \(n\) 的排列 \(p_1, p_2, \cdots, p_n\) 。
  • 对于每个 \(i\) ,\(d_i = gcd(p_i, p_{i \% n + 1})\)
  • 排列 \(p\) 的 \(score\) 为数组 \([d_1, d_2, \cdots, d_n]\) 中不同数的个数。

给一个 \(n\) ,需要构造一个排列 \(p\) ,使得 \(score_p\) 最大。

\(key\) :若一个数组中,任意 \(g = gcd(a_i, a_j)\) 存在,则数组中 \(2 \cdot g\) 存在。

  • 推论:\(n\) 的排列中任选两个数可构造的 \(gcd\) 范围为 \([1, \frac{n}{2}]\) 。

如何让相邻两个数的 \(gcd\) 取遍 \([1, \frac{n}{2}]\) 。

考虑一个贪心做法: \(x | y\) 可以满足的条件之一为 \(y \geq 2x\) 。于是枚举所有奇数 \(i\) ,然后构造出一组连续的 \(i \cdot 2^k \leq n\) 。程序结束后 \(1 \sim n\) 都会出现一次,且 \([\lfloor \frac{n}{2} \rfloor + 1, n]\) 会出现在每组的最后一位。于是 \(gcd\) 取遍 \(1, \lfloor \frac{n}{2} \rfloor\) 。

view
#include <bits/stdc++.h>
typedef long long ll;
void solve(){
	int n; std::cin >> n;
	std::vector<int> ans;
	for (int i = 1; i <= n; i += 2) {
		for (int j = i; j <= n; j *= 2) {
			ans.push_back(j);
		}
	}
	for (int i = 0; i < ans.size(); i++) std::cout << ans[i] << " \n"[i == ans.size() - 1];
}
int main() {
	int _ = 1; std::cin >> _;
	while (_--) {solve();}
	return 0;
}

标签:lfloor,排列,frac,gcd,int,Codeforces,893,数组,Problem
From: https://www.cnblogs.com/zsxuan/p/17770830.html

相关文章

  • Codeforces Round 892 (Div. 2) B. Olya and Game with Arrays
    一系列\(n\)个数组,第\(i\)个数组的大小\(m_i\geq2\)。第\(i\)个数组为\(a_{m_1},a_{m_2},\cdots,a_{m_i}\)。对于每个数组,你可以移动最多一个元素到另一个数组。一系列\(n\)个数组的\(beauty\)定义为\(\sum_{i=1}^{n}min_{j=1}^{m_i}a_{i,j}\)。询问你......
  • Codeforces Round #870 (Div. 2) A. Trust Nobody
    题解#include<cstdio>#include<vector>#include<queue>#include<cstring>#include<algorithm>#include<iostream>#include<stack>#include<bitset>#include<cstdlib>#include<cmath>#include......
  • 【转载】How to solve the problem that getting timestamp from Mysql database is 8
    Thisarticleintroducestherelevantknowledgeof"howtosolvetheproblemofobtainingtimestampfromMysqldatabase8hoursearlierthanthenormaltime".Intheoperationprocessofactualcases,manypeoplewillencountersuchdifficulties.......
  • Educational Codeforces Round 154 (Rated for Div. 2) B. Two Binary Strings
    给定两个长度相等的\(01\)字符串\(a\)和\(b\)。每个字符串都是以\(0\)开始以\(1\)结束。在一步操作中,你可以选择任意一个字符串:选择任意两个位置\(l,r\)满足\(s_l=s_r\),然后让\(\foralli\in[l,r],s_i=s_l\)。询问经过若干次操作后能否使得\(a=b......
  • 【codeforces】cf880div2 vp小结
    碎碎念多测要清空!清空从0开始循环!!!!!!!爆哭不知道因为初始化和清空罚了多少次了呜呜呜呜呜这次真的真的记得清空了,但是因为一直习惯下标从1开始所以导致for循环清空的时候a[0]没有清空A和B简简单单的两个签,但是C的难度就突然升高,补题的时候发现1700的时候真的...犹豫了一下要不要补......
  • Codeforces Round 697 (Div. 3) A. Odd Divisor
    给定一个正整数\(n\),询问是否存在一个\(>1\)的奇数因子。在唯一分解定理下观察\(n\),发现若存在除\(2\)以外的质因子,则\(n\)存在\(>1\)的奇数因子。换句话说\(n\)不是二次幂形式则存在\(>1\)的奇数因子。view#include<bits/stdc++.h>voidsolve(){ long......
  • Codeforces Round 895 (Div. 3) B. The Corridor or There and Back Again
    你在一个向右延申的无限坐标轴上,且你初始在坐标\(1\)。有\(n\)个陷阱在坐标轴上,第\(i\)个陷阱坐标为\(d_i\),且会在你踩上这个陷阱的\(s_i\)秒过后发动。这时候你不能进入坐标\(d_i\)或者走出坐标\(d_i\)。你需要确定最远的\(k\),保证你能够走到坐标\(k\),并且顺......
  • Codeforces Round 896 (Div. 2) A. Make It Zero
    给一个大小为\(n\)的数组\(a\)\((n\geq2)\)。你希望进过一些操作使得\(\foralli,a_i=0\)。在一步操作中,可以选择\(1\leql\leqr\leqn\)并且执行:\(s=\bigoplus_{i=l}^{r}a_i\)。\(\foralll\leqi\leqr,a_i=s\)。输出一个解决方案,使得操作......
  • Codeforces Round 635 (Div. 2) B. Kana and Dragon Quest game
    你需要击败一只巨龙,他有\(h\)点血量,你可以使用以下两种攻击方式:黑洞:使巨龙的血量变为\(\lfloor\frac{h}{2}\rfloor+10\)。可以使用\(n\)次。雷击:使巨龙的血量变为\(h-10\)。可以使用\(m\)次/当巨龙的血量\(h\leq0\)时,你将他击败了。询问你是否可以将他击......
  • Codeforces Round 637 (Div. 2) - Thanks, Ivan Belonogov! A. Nastya and Rice
    纳斯塔亚掉了\(n\)个谷物,每个谷物的重量范围在\([a-b,a+b]\)。她猜测谷物的总重量范围在\([c-d,c+d]\)。询问她的猜测是否正确。显然,若\([n(a-b),n(a+b)]\)和\([c-d,c+d]\)有交,则她的猜测正确。view#include<bits/stdc++.h>typedeflonglongll;......