1 条题解

  • 0
    @ 2025-8-24 22:41:22

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar Flanksy
    Where we gonna go?

    搬运于2025-08-24 22:41:22,当前版本为作者最后更新于2023-11-10 21:22:52,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    数学

    很难想的分类讨论,笔者的思路中只有一种能够得到答案。


    n1000000n \leq 1000000

    直接计算 G1,G2,G3G106G_1,G_2,G_3 \cdots G_{10^6} 的值,计算完毕后可以回答 n106n \leq 10^6 的询问。


    n3793540542n \leq 3793540542

    利用得到的信息扩展可以求解的范围,发现 G106=6137,G6137=264G_{10^6}=6137,G_{6137}=264,但 61376137 在序列前 10610^6 项中只出现 117117 次,扩展时需要考虑未出现的 14714761376137 造成的影响。

    为了方便,计算 G1,G2,G3G106+147G_1,G_2,G_3 \cdots G_{10^6+147},从 G106+147+1G_{10^6+147+1},即 G1000148=6138G_{1000148}=6138 开始扩展。

    G6138=264G_{6138}=264 i[106+147+1,106+147+264],Gi=6138\forall \ i \in [10^6+147+1,10^6+147+264],G_i=6138。像这样枚举 [6138,106+147][6138,10^6+147] 中每个整数 ii 并计算满足 Gj=iG_j=i 的整数 jj 的范围能够得到 n3793540542n \leq 3793540542 时任意 GnG_n 的值。


    3793540543n2×10153793540543 \leq n \leq 2 \times 10^{15}

    进一步扩展,如果区间 [l,r][l,r] 满足  j[l,r],Gj=i\forall \ j \in [l,r],G_j=i,那么 [l,r][l,r] 中的数在 GG 中将出现 (rl+1)×i(r-l+1) \times i 次。

    满足 Gj=iG_j=i 的整数 jj 必定为一段连续自然数。

    利用以上性质确定 GnG_n 的值域 [l,r][l,r],该区间不仅需要满足  j[l,r],Gj=i\forall \ j \in [l,r],G_j=i,还需要满足 Gl1Gl,Gr+1GrG_{l-1} \neq G_l,G_{r+1} \neq G_r

    确定 GnG_n 值域 [l,r][l,r] 的同时可以确定满足 Gk[l,r]G_k \in [l,r] 的整数 kk 的范围 [l,r][l',r'],显然 n[l,r]n \in [l',r']

    根据自描述序列的定义,由于  j[l,r],Gj=i\forall \ j \in [l,r],G_j=i值域 [l,r][l,r] 中的每个数在 GG 中都出现 ii

    根据 nn 在区间 [l,r][l',r'] 中第 nl+1n-l'+1 个位置得到 $G_n=l +\left \lceil \frac{n-l'+1}{i} \right \rceil -1 = l+ \left \lfloor \frac{n-l'}{i} \right \rfloor$。

    结合 n3793540542n \leq 3793540542 时的做法能够通过本题。

    #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
    上传者