P12835 [蓝桥杯 2025 国 B] 蓝桥星数字 题解

· · 题解

额……水篇……题解?

首先我们注意到,蓝桥星数字中的 x 位数是有 9 \times 5^{x-1} 个的。因为最高位不受限 1 \sim 9 随便选一共 9 种,后面的就必须和前面奇偶性不同,只剩 5 种选发。

那么根据这个信息你就可以先判断出第 n 个蓝桥星数字是几位数了,这里暂且记为 len 位数。

接着你就是挨个填写了。考虑用 tmp 存储当前考虑的部分的后面大半截的选择方案数,这样就可以用 n 直接去除,得到的商就是这一位的值。每次求出来以后,n 可以考虑用 \bmod 往下筛,而 tmp 将不断变小。

以及这里要记得用一个 flag 记录目前的奇偶性情况,因为蓝桥星数字是奇偶交错出现的。

嗯,口述起来确实有点绕哈。但是代码就比较一目了然了,很简单,并且为了方便各位理解还加上了详细的注释喵!

#include<bits/stdc++.h>
#define LL long long
#define UInt unsigned int
#define ULL unsigned long long
#define LD long double
#define pii pair<int,int>
#define pLL pair<LL,LL>
#define pDD pair<LD,LD>
#define fr first
#define se second
#define pb push_back
#define isr insert
using namespace std;
LL n,tmp,len,flag;
LL read(){
    LL su=0,pp=1;char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')pp=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){su=su*10+ch-'0';ch=getchar();}
    return su*pp;
}

int main(){
    n=read();
    tmp=45,len=2;//蓝桥星数字是没有一位数的
    while(n>tmp)n-=tmp,len++,tmp*=5;
    //确定第 n 个蓝桥星数字的位数
    tmp/=9;//降低到次高位个数
    n--;//方便处理取整问题,其实你直接写向上取整应该也是没问题的哈
    flag=(n/tmp+1)%2;//记录奇偶性
    cout<<n/tmp+1;//最高位单独拎出来算
    n%=tmp;//只需要剩下余数用作后续处理
    for(int i=1;i<len;i++){//枚举每一位
        tmp/=5;//前面是 9 后面都是 5 了哦
        cout<<(n/tmp)*2+1-flag;//注意奇偶性
        flag=1-flag;//改变奇偶性
        n%=tmp;//同样的操作,剩个余数即可
    }cout<<"\n";//强迫症输出换行……
    return 0;
}

如果本篇题解对你有帮助的话,麻烦你点一个小小的赞,真是太感谢啦!