【MX-J3】 T0 官方题解

· · 题解

Z. 37 官方题解

本题考察的主要知识点:

模拟法

计算出 37a,然后判断 a\gets 37a\gets 表示赋值)是否所有数位都相等。

思考一下怎么判断一个数个位和十位都相等——只要先取末两位 a\bmod 100,再判断其是否为 11 的倍数。如果是(也就是 a%100%11==0),那么个位和十位就相等。

接下来判断十位和百位是否相等,百位和千位,以此类推。这个实现可以通过每次除以 10,直到变成一位数为止。具体可以参考代码。

#include<bits/stdc++.h>
using namespace std;
int a;
int main(){
    cin>>a;
    a*=37;
    bool res=true;
    while(a>=10){
        if(a%100 % 11)
            res=false;
        a/=10;
    }
    if(res)cout<<"Yes";
    else cout<<"No";
    return 0;
}

数学法

如果 37a 是三位数,那么 37a 必须是 111 的倍数,也就是 a3 的倍数。

如果 37a​ 是四位数或五位数(以 \overline {aaaa}​ 为例),则 \overline{aaa0}​37​ 的倍数,也就是 a​37​ 的倍数,而这是不可能的。五位数同理。

因此 37a 只可能是 0 或三位数或六位数。在 37a 是六位数的前提下,不难发现 111111\div 37 = 3003,而 2\times 3003>3737,故在数据范围限制下,a 只能是 3003

总而言之,a 要么小于等于 27 且为 3 的倍数,要么是 3003

#include<bits/stdc++.h>
using namespace std;
int a;
int main(){
    cin>>a;
    if(a<=27 and a%3==0 or a==3003)
        cout<<"Yes";
    else
        cout<<"No";
    return 0;
}