DFS+余数运用

链接:https://ac.nowcoder.com/acm/contest/77231/C
来源:牛客网

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
Special Judge, 64bit IO Format: %lld

题目描述

小红来到了红魔馆。众所周知,红魔馆的馆主是一只 495 岁的吸血鬼,所以她非常喜欢 495 这个数。
现在,小红拿到了一个正整数,她想在这个正整数的结尾增加尽可能少的数字,使得该数字变成 495 的倍数。请你给出任意一个添加方案。

输入描述:

一个正整数 n
1 ≤ n ≤ 1e18

输出描述:

如果给定是正整数本身就是 495 的倍数,请输出 -1。
否则输出一个数字串,代表将该数字串添加到原数的结尾。有多解时输出任意即可,你只需要保证该数字串长度尽可能短。

示例1

输入

49

输出

5

说明

只需要添加一个 5 即可。

示例2

输入

9

输出

90

说明

添加 90 后,990 是 495 的倍数。









解答

  • 误区:找每个位上数字相加 % 18 == 0 的数,因为看到 495 各个位上相加为 18
  • 这种类型思路:将这个数 % 495,余数进行添加
  • 比如在后面添加一个数,看它是否是 495 倍数,也就是余数是否为 0 ,而假设不为 0 ,也就是余数乘 10 + 这个数,因为前面整除部分相当于乘 10
  • 所以就判断是否加一个数这个余数是否为 0 ,直接 DFS
#include <iostream>
using namespace std;
string ans = "100000000000000";
typedef long long LL;

void dfs(int yu, string now) 
{
    if (yu == 0) 
    {
        if (now.length() < ans.length()) ans = now;
        return;
    }

    if (now.length() > ans.length()) return;

    for (int i = 0; i <= 9; i++) 
    {
        dfs((yu * 10 + i) % 495, now + (char)('0' + i));
    }
}

int main()
{
    LL n;
    cin >> n;

    n %= 495;
    if (n == 0) 
    {
        cout << -1 << endl;
        return 0;
    }

    dfs( n, "");

    cout << ans << endl;
    return 0;
}
posted @   星竹z  阅读(1)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示