专栏文章
题解:P12464 『FCRT / 1 - 1』Seats
P12464题解参与者 4已保存评论 3
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 3 条
- 当前快照
- 1 份
- 快照标识符
- @mipcn27x
- 此快照首次捕获于
- 2025/12/03 09:49 3 个月前
- 此快照最后确认于
- 2025/12/03 09:49 3 个月前
默认下面的 的底数为 , 为一自然数。
题目解法
看到 就可以想到这题可以先打表,找找规律。打表代码没存,就不放了。打出来的表:
TEXT1 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
第一眼似乎没有规律,但是可以发现每个数字都出现了一次及以上,且单调不减,所以把每个数字出现的次数统计一下(缩表)。
CPP2
2
3
1
5
1
1
1
9
1
1
1
1
1
1
1
17
1
1
1
可以发现,令接下来第 个非 的数 ,则后面跟着的 的个数为 ,与 的和为 (第 项例外),总和(缩表前的项数) 。
接下来就容易一些了。举个例子, 时,首先要求出比 小的最大的 : ,这就是前面提到的“总和”。去掉 ,我们的表如下所示:
CPP5
1
1
1
9
1
1
1
1
1
1
1
17
1
1
1
去掉了 ,还剩下 。
因为 是小于 的最大的 ,所以可以把 及之后的给去掉:
CPP5
1
1
1
再把表扩展开:
CPP5 5 5 5 5 6 7 8
找到第二项 ,即是最终答案。
对于其他的 同理。
特判: 时,答案是 。
代码:
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;
}
时间复杂度 。
相关推荐
评论
共 3 条评论,欢迎与作者交流。
正在加载评论...