专栏文章

题解:P12464 『FCRT / 1 - 1』Seats

P12464题解参与者 4已保存评论 3

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
3 条
当前快照
1 份
快照标识符
@mipcn27x
此快照首次捕获于
2025/12/03 09:49
3 个月前
此快照最后确认于
2025/12/03 09:49
3 个月前
查看原文
默认下面的 log\log 的底数为 22kk 为一自然数。

题目解法

看到 N9×1018N\le 9\times 10^{18} 就可以想到这题可以先打表,找找规律。打表代码没存,就不放了。打出来的表:
TEXT
1 1 2 2 3 3 3 4 5 5 5 5 5 6 7 8 9 9 9 9 9 9 9 9 9 10 11 12 13 14 15 16 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 18 19 20
第一眼似乎没有规律,但是可以发现每个数字都出现了一次及以上,且单调不减,所以把每个数字出现的次数统计一下(缩表)。
CPP
2
2
3
1
5
1
1
1
9
1
1
1
1
1
1
1
17
1
1
1
可以发现,令接下来第 ii 个非 11 的数 =x=x,则后面跟着的 11 的个数为 x2x-2,与 xx 的和为 2i12^{i-1}(第 11 项例外),总和(缩表前的项数) =21+22++2i1+2=2i=2^1+2^2+\dots+2^{i-1}+2=2^i
接下来就容易一些了。举个例子,N=10N=10 时,首先要求出比 NN 小的最大的 2k2^k2log(N)=82^{\lfloor\log(N)\rfloor}=8,这就是前面提到的“总和”。去掉 88,我们的表如下所示:
CPP
5
1
1
1
9
1
1
1
1
1
1
1
17
1
1
1
去掉了 88,还剩下 108=210-8=2
因为 88 是小于 NN 的最大的 2k2^k,所以可以把 99 及之后的给去掉:
CPP
5
1
1
1
再把表扩展开:
CPP
5 5 5 5 5 6 7 8
找到第二项 55,即是最终答案。
对于其他的 NN 同理。
特判:N2N\le 2 时,答案是 11
代码:
CPP
#include<bits/stdc++.h>
using namespace std;
#define int unsigned long long
int n;
signed main(){
	cin>>n;
	if(n<=2) return printf("1\n"),0;
	int x=log2(n);
	int y=pow(2,x);
	n-=y;
	y/=2;
	if(n<=y+1) cout<<y+1;
	else cout<<y+1+(n-(y+1));
	return 0;
}
时间复杂度 O(logN)O(\log N)

评论

3 条评论,欢迎与作者交流。

正在加载评论...