[CF1713C Build Permutation] 题解

[CF1713C Build Permutation] 题解

水一篇题解

先来证明一点小东西:在 n , n + 1 , n + 2 ⋯ 2 n n,n+1,n+2\cdots 2n n,n+1,n+22n 中一定有一个完全平方数 k k k

假设 k = ⌈ n ⌉ 2 k={\lceil \sqrt{n} \rceil}^2 k=n 2 k ≥ n k\ge n kn
根据上取整的定义可知 ⌈ n ⌉ ≤ n + 1 {\lceil \sqrt{n} \rceil} \le \sqrt{n} + 1 n n +1
平方可得 k = ⌈ n ⌉ 2 ≤ n + 2 n + 1 k = {\lceil \sqrt{n} \rceil}^2 \le n + 2\sqrt{n} + 1 k=n 2n+2n +1
因为 k ≤ 2 n k \le 2n k2n 所以 n ≥ 2 n + 1 n \ge 2\sqrt{n} + 1 n2n +1
解的 n ≥ 1 2 + 3 2 ≈ 1.37 \sqrt{n} \ge \dfrac{1}{2} + \dfrac{\sqrt{3}}{2} \approx 1.37 n 21+23 1.37 成立,此时 n ≥ 1.87 n \ge 1.87 n1.87
代入 n = 1 n=1 n=1 ,发现也成立,既命题成立,证毕。

可以将上面的命题转化为 0 ≤ k − n ≤ n 0 \le k-n \le n 0knn 其中 k k k 为完全平方数,只需找到 k k k 便可以将 [ k − n , n ] [k-n,n] [kn,n] 匹配好,然后只需递归求解即可。

贴上核心代码:

inline void trav(int n) {
	if (n <= 0)
		return;
	int k = sqr(ceil(sqrt((double)n - 1)));
	int l = k - n + 1, r = n;
	for (int i = l; i < r; i++)
		arr[i] = k - i;
	trav(l);
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值