1 条题解

  • 0
    @ 2025-8-24 22:37:05

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar LYqwq
    RP+=+∞ || 不拿钩 7 不改签名

    搬运于2025-08-24 22:37:05,当前版本为作者最后更新于2022-03-22 18:22:16,作者可能在搬运后再次修改,您可在原文处查看最新版

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

    以下是正文


    题目传送门

    题目大意

    定义一个十进制正整数为「kk 阶天才数」,当且仅当该整数的位数为 kk 的倍数,且每一个数位均为 99

    例如,9999999922 阶天才数,而 999999 不是 22 阶天才数,但它是 11 阶天才数,也是 33 阶天才数。

    现在给定 tt 个询问,每次询问给定两个正整数 nnkk,求能否把 nn 拆分成若干个 kk 阶天才数的和。

    能则输出一行一个字符串 aya,否则输出 baka

    思路

    赛时竟读错题,搞成判断 nn 是不是 kk 阶天才数了...喜提 1010 pts。

    首先是如何取这个「kk 阶天才数」,很容易发现最小的「kk 阶天才数」就可以应对所有情况。

    例如,k=3k=3,那么最小的「kk 阶天才数」就是 999999,可以发现 999999mod999=0999999 \bmod 999=0999999999mod999=0999999999 \bmod 999=0999999999999mod999=0999999999999 \bmod 999=0······

    总之,用多大的「kk 阶天才数」组成 nn,都是用对应数量的最小的「kk 阶天才数」来组成 nn

    用多个不同的「kk 阶天才数」也是如此,只需用多个最小的「kk 阶天才数」即可拼凑而成。

    于是,我们只需判断 nmodn \bmod 最小的「kk 阶天才数」是否等于 00 即可完成本题。

    我们用一个数组 mm 来存储最小的「kk 阶天才数」,询问时直接用于判断即可。

    注意,要开 long long,最小的「1010 阶天才数」超出了 int 范围。

    代码

    #include <iostream>
    using namespace std;
    long long t,k,n,m[15]={0,9,99,999,9999,99999,999999,9999999,99999999,999999999,9999999999,99999999999};
    
    int main(){
        cin >> t;
        while(t--){
            cin >> k >> n;
            if(n%m[k]==0) puts("aya");
            else puts("baka");
        }
        return 0;
    }
    
    • 1

    信息

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