1 条题解

  • 0
    @ 2025-8-24 23:09:27

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar yuhaotian000
    Come on City!||征求粉福中||不拿蓝钩不改签||不拿S一等奖不改签||不到红名不改签||曼城不拿欧冠不改签||蛋小黄可爱捏~

    搬运于2025-08-24 23:09:27,当前版本为作者最后更新于2025-02-04 14:33:34,作者可能在搬运后再次修改,您可在原文处查看最新版

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

    以下是正文


    又来写题解了。
    题目传送门

    题目大意

    如果 XX 是首中尾相等数,那么 XX 的数位应为奇数且 XX 的首位、末位和最中间的数位上的数字相等。
    求出 [L,R][L,R] 中所有的首中尾相等数。

    题目解法

    我们注意到数据范围,1T10,1LR1051 \le T \le 10,1 \le L \le R \le 10^5,也就是我们最大的数也不会超过 100000100000。由于数位应该是奇数,所以仅有 191\sim9100999100\sim999100009999910000\sim99999 有可能是首中尾相等数。

    接着,对于这三个区间,我们有:

    • 191\sim9 一定为首中尾相等数。
    • 100999100\sim999 仅有三个数位,所以只要这三个数位全部相同就是首中尾相等数。
    • 100009999910000\sim99999 仅有五个数位,所以只要第一个数位、第三个数位、第五个数位全部相同就是首中尾相等数。

    这里我们用到一个在语法段就学过的知识。数字 XX 的最后一个数位的数是 Xmod10X\mod10。那么,倒数第二个数位就是 X÷10mod10X\div10\mod10。以此类推,每向左一个数位就将除的数乘 1010。第一个数位的数是 X÷10X\div10

    对于每个 [L,R][L,R],我们只需要循环枚举即可。

    AC code

    #include <bits/stdc++.h>
    using namespace std;
    int main(){
        int t;
        cin>>t;
        while(t--){
            int l,r;
            cin>>l>>r;
            for(int i=l;i<=r;i++){
                if(1<=i&&i<=9){
                    cout<<i<<" ";
                }else if(100<=i&&i<=999){
                    if(i%10==i/10%10&&i/10%10==i/100){
                        cout<<i<<" ";
                    }
                }else if(10000<=i&&i<=99999){
                    if(i%10==i/100%10&&i/100%10==i/10000){
                        cout<<i<<" ";
                    }
                }
            }
            cout<<endl;
          }
          return 0;
    }
    
    • 1

    [Algo Beat Contest 001 B] Between Head and Tail

    信息

    ID
    11394
    时间
    1000ms
    内存
    128MiB
    难度
    1
    标签
    递交数
    0
    已通过
    0
    上传者