ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

CF EDU 101 D - Ceil Divisions

2022-05-28 21:31:07  阅读:166  来源: 互联网

标签:cnt 101 log int CF Ceil ++ ans include


D - Ceil Divisions

构造

方法1

可考虑先把除了 1,2,k 的所有数跟 n 搞一下,这个一定是花 n - 4 次让除了 k,n 都满足条件

现在就让 n,k 变成 1

  1. 一直让 n 跟 k 搞,需要 \(\lceil log_kn\rceil\)次
  2. 一直让 k 跟 2 搞,需要 \(\lceil log_2k\rceil\) 次

求出 \(\lceil log_kn\rceil+\lceil log_2k\rceil\) 最小的 \(k\), 可以证明 这个值 <= 9

方法2

可以考虑根号算法,先让 \([\sqrt n+1,n-1]\) 跟 \(n\) 搞, 每个数花 1 次;再让 \(n\) 跟 \(\sqrt n\) 搞,这时候相当于 \(n\) 额外花了一次,类似于这样反复, \(n\) 开 5 次根号就到 1 了,所以要额外花这么多次,也是满足操作在 n + 5 之内的

#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>
#include <cmath>

using namespace std;
typedef long long ll;
typedef pair<int, int> PII;

const int N = 2e5 + 10;
PII ans[N];
int n, k;
int a[N];
int log(int a, int b)
{
	return ceil(log(a) / log(b));
}
int main()
{
	ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
	int T;
	cin >> T;
	while(T--)
	{
		cin >> n;
		for (int i = 1; i <= n; i++)
			a[i] = i;
		int minn = 1e9;
		for (int i = 2; i <= 50; i++)
		{
			if (minn > log(n, i) + log(i, 2))
			{
				minn = log(n, i) + log(i, 2);
				k = i;
			}
		}
		int cnt = 0;
		for (int i = 3; i < n; i++)
		{
			if (i == k)
				continue;
			a[i] = 1;
			ans[++cnt] = {i, n};
		}
			
		while(a[n] != 1)
		{
			ans[++cnt] = {n, k};
			a[n] = (a[n] + k - 1) / k;
		}
		if (k != 2)
		{
			while(a[k] != 1)
			{
				ans[++cnt] = {k, 2};
				a[k] = (a[k] + 1) / 2;
			}
		}
		// for (int i = 1; i <= n; i++)
			// cout << a[i] << " ";
		// cout << endl;
		cout << cnt << endl;
		for (int i = 1; i <= cnt; i++)
			cout << ans[i].first << " " << ans[i].second << endl;
	}
	return 0;
}

标签:cnt,101,log,int,CF,Ceil,++,ans,include
来源: https://www.cnblogs.com/hzy717zsy/p/16322011.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有