1 条题解

  • 0
    @ 2025-8-24 23:03:16

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar yummy
    这个人是时代的眼泪,什么也没有留下

    搬运于2025-08-24 23:03:15,当前版本为作者最后更新于2024-08-25 18:55:35,作者可能在搬运后再次修改,您可在原文处查看最新版

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

    以下是正文


    Z. 37 官方题解

    本题考察的主要知识点:

    • 【2】分支语句
    • 【2】循环语句(模拟法)
    • 【3】简单数论(数学法)

    模拟法

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

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

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

    #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;
    }
    

    数学法

    如果 37a37a 是三位数,那么 37a37a 必须是 111111 的倍数,也就是 aa33 的倍数。

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

    因此 37a37a 只可能是 00 或三位数或六位数。在 37a37a 是六位数的前提下,不难发现 111111÷37=3003111111\div 37 = 3003,而 2×3003>37372\times 3003>3737,故在数据范围限制下,aa 只能是 30033003

    总而言之,aa 要么小于等于 2727 且为 33 的倍数,要么是 30033003

    #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;
    }
    
    • 1

    信息

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