1 条题解

  • 0
    @ 2025-5-25 23:15:23

    题意分析

    题目要求我们找到第nn野兽数字,即**至少包含三个连续的66**的正整数。例如,前几个野兽数字是:

    • 666666(第11个)
    • 16661666(第22个)
    • 26662666(第33个)
    • \ldots
    • 66666666(第66个)
    • 6666666666(第187187个)

    给定TT个查询,每个查询给出一个nn,要求输出第nn个野兽数字。

    解题思路

    由于nn的范围可能很大(1n5×1071 \leq n \leq 5 \times 10^7),直接枚举所有数字并检查是否包含666666显然效率太低。因此,我们需要一种更高效的方法来生成野兽数字。

    方法1:数位生成法

    我们可以按数字的位数从小到大生成所有可能的野兽数字:

    1. 3位数:只有666666
    2. 4位数:形式为X666\overline{X666}666X\overline{666X},其中XX1199的数字。
    3. 5位数及以上:类似地,可以在不同位置插入666666,并填充其他数字。

    这种方法需要仔细处理重复和顺序问题,但可以高效生成所有野兽数字。

    方法2:二分答案 + 数位DP

    1. 二分答案:假设当前检查的数字是midmid,我们需要计算mid\leq mid的野兽数字的个数cntcnt。如果cntncnt \geq n,则答案在左半区间;否则在右半区间。
    2. 数位DP:用于计算mid\leq mid的野兽数字的个数。状态可以设计为:
      • 当前位数pospos
      • 是否已经出现666666has_beasthas\_beast
      • 前几位是否是连续的66last_sixlast\_six
      • 是否受midmid的限制(limitlimit

    这种方法适用于较大的nn,但实现较为复杂。

    方法3:预处理 + 直接查询

    由于nn的范围是5×1075 \times 10^7,我们可以预处理前5×1075 \times 10^7个野兽数字,然后直接回答查询。这种方法适用于多次查询,但预处理时间可能较长。

    标程

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    using namespace std;
    int t,x,f[25][4];
    void cl()
    {
    	f[0][0]=1;
    	for(int i=0;i<20;i++)
    	{
    		for(int j=0;j<=2;j++)
    		{
    			f[i+1][j+1]+=f[i][j];
    			f[i+1][0]+=f[i][j]*9;
    		}
    		f[i+1][3]+=10*f[i][3];
    	}
    }
    int main()
    {
    	scanf("%d",&t);
    	cl();
    	while(t--)
    	{
    		scanf("%d",&x);
    		int m;
    		for(m=3;f[m][3]<x;m++);
    		for(int i=m,k=0;i>=1;i--)
    			for(int j=0;j<=9;j++)
    			{
    				long long cnt=f[i-1][3];
    				if(j==6||k==3)
    					for(int l=max(0,3-k-(j==6));l<3;l++)
    						cnt+=f[i-1][l];
    				if(cnt<x)
    				{
    					x-=cnt;
    					continue;
    				}
    				else
    				{
    					if(k<3&&j==6)k++;
    					if(k<3&&j!=6)k=0;
    					printf("%d",j);
    					break;
    				}
    			}
    		printf("\n");
    	}
    	return 0;
    }
    
    • 1

    信息

    ID
    2209
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    2
    已通过
    1
    上传者