P8676 [蓝桥杯 2018 国 A] 自描述序列
数学
很难想的分类讨论,笔者的思路中只有一种能够得到答案。
n \leq 1000000
直接计算
n \leq 3793540542
利用得到的信息扩展可以求解的范围,发现
为了方便,计算
由
3793540543 \leq n \leq 2 \times 10^{15}
进一步扩展,如果区间
满足
利用以上性质确定
确定
根据自描述序列的定义,由于
根据
结合
#include<bits/stdc++.h>
using namespace std;
constexpr long long uim=3793540542ll;
constexpr int sta=6138,lim=1000147;
int pos,dp[2000005];//dp[i]存储数列第i项的值
long long n,ans;
int main(){
scanf("%lld",&n);
pos=3,dp[1]=1ll,dp[2]=2ll,dp[3]=2ll;
for(int i=3;pos+1<=lim;i++)
for(int j=1;j<=dp[i]&&pos+1<=lim;j++){
dp[++pos]=i;
if(pos==n) return printf("%d\n",i),0;
}
long long l=lim,r=lim,ls=uim,rs=uim;
for(int i=sta;i<=lim;i++){
l=r+1,r+=dp[i]; //更新j的范围
ls=rs+1,rs+=(r-l+1)*i; //更新k的范围
if(n>=l&&n<=r) ans=i; //找到答案(n<=3793540542)
if(n>=ls&&n<=rs) ans=l+(n-ls)/i;//找到答案(n>=3793540543)
if(ans!=0ll) break;
}
printf("%lld\n",ans);
return 0;
}