1 条题解
-
0
自动搬运
来自洛谷,原作者为

Flanksy
Where we gonna go?搬运于
2025-08-24 22:41:22,当前版本为作者最后更新于2023-11-10 21:22:52,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
数学
很难想的分类讨论,笔者的思路中只有一种能够得到答案。
直接计算 的值,计算完毕后可以回答 的询问。
利用得到的信息扩展可以求解的范围,发现 ,但 在序列前 项中只出现 次,扩展时需要考虑未出现的 个 造成的影响。
为了方便,计算 ,从 ,即 开始扩展。
由 得 。像这样枚举 中每个整数 并计算满足 的整数 的范围能够得到 时任意 的值。
进一步扩展,如果区间 满足 ,那么 中的数在 中将出现 次。
满足 的整数 必定为一段连续自然数。
利用以上性质确定 的值域 ,该区间不仅需要满足 ,还需要满足 。
确定 值域 的同时可以确定满足 的整数 的范围 ,显然 。
根据自描述序列的定义,由于 ,值域 中的每个数在 中都出现 次。
根据 在区间 中第 个位置得到 $G_n=l +\left \lceil \frac{n-l'+1}{i} \right \rceil -1 = l+ \left \lfloor \frac{n-l'}{i} \right \rfloor$。
结合 时的做法能够通过本题。
#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; }
- 1
信息
- ID
- 5980
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 3
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者