首页 > 其他分享 >Atcoder ARC084D Small Multiple

Atcoder ARC084D Small Multiple

时间:2023-02-28 20:25:20浏览次数:47  
标签:Atcoder Multiple 10 int vis front Small 数位 dis

\(O(k)/O(k)\)

解法

标签:
建图 最短路

考虑对于一个数 \(x\),考虑由它在末尾改变能产生哪些状态:

  1. \(x+1\),此时对应的数位和 \(+1\)
  2. \(x\times 10\),对应数位和不变

那直接把这些能到达状态缩成一条边,跑一个点的值是在 \(\bmod k\) 意义下数位和的最小值的最短路
初始值设成 \(dis_1=1\),因为 \(k\ge 2\),\(dis_1=1\) 绝对是最优解
最终答案即为 \(dis_0\)

边权只有 \(01\),跑个 \(\operatorname{01BFS}\) 就行啦

Q:\(9+1=10\) 数位和 \(=1\) 啊?

A:能发现,\(10\) 明显有更简单的方法推来:\(1\times 10\),这个状态一定会出现在 \(9+1\) 之前(\(dis_1=1,dis_9=9\)),所以不会挂掉

代码

# include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
int dis [N];
bool vis [N];
int main () {
	int k;
	scanf ("%d", & k);
	memset (dis, 0x3f, sizeof (dis));
	dis [1] = 1;
	deque <int> q;
	q .push_front (1);
	while (! q .empty ()) {
		int u = q .front ();
		q .pop_front ();
		if (vis [u]) {
			continue;
		}
		vis [u] = 1;
		int v_0 = (u * 10) % k;// * 10
		if (dis [u] < dis [v_0]) {
			dis [v_0] = dis [u];
			q .push_front (v_0);
		}	
		int v_1 = (u + 1) % k;// + 1
		if (dis [u] + 1 < dis [v_1]) {
			dis [v_1] = dis [u] + 1;
			q .push_back (v_1);
		}
	}
	printf ("%d", dis [0]);
	return 0;
}

标签:Atcoder,Multiple,10,int,vis,front,Small,数位,dis
From: https://www.cnblogs.com/lhzawa/p/17165831.html

相关文章

  • [AtCoder Grand Contest 060][C. Large Heap]
    看了几篇题解都是从下往上(子树大小从小到大)推的,来整一个从上往下的。题目链接:C-LargeHeap题目大意:称一个大小为\(2^N-1\)的排列是好排列当且仅当其满足对任意\(1\l......
  • AtCoder Beginner Contest 280 A-F 题解
    比赛链接A-PawnonaGrid模拟。#include<cstdio>#include<algorithm>#include<cstring>usingnamespacestd;constintN=15;intn,m,ans;chars[N];i......
  • AtCoder Beginner Contest 279 A-E 题解
    比赛链接A-wwwvvvvvv直接模拟#include<cstdio>#include<cstring>constintN=105;intn,ans;chars[N];intmain(){ scanf("%s",s+1); for(inti=1......
  • AtCoder Beginner Contest 291 A-F 题解
    。。。比赛链接A-camelCase直接循环判断。#include<cstdio>#include<cstring>constintN=20;chars[N];intmain(){ scanf("%s",s+1); for(inti=1;......
  • Atcoder试题乱做 Part8
    我喜欢这样跟着你,随便你带我到哪里.\(\text{[ABC231H]MinimumColoring}\)\(\color{green}{\text{[EASY]}}\)显然的行列二分图模型,一个可以染色的格子对应一个权值为......
  • Atcoder ABC 291
    AtcoderABC291D题意n张牌,每张牌两面都有数字,可以翻面,问有多少种情况使得这n张牌中每相邻两张牌表面上的数互不相同思路线性dp,每次比较当前位和上一位是否相同即可......
  • AtCoder Beginner Contest 291
    比赛链接A-camelCase题目大意给一个由英文字母构成的字符串\(S\),\(S\)中只有一个大写字母,输出该大写字母是字符串中第几个字母。题目思路遍历字符串找出大写字母......
  • (AtCoder Beginner Contest 289)And Codeforces Round #851 (Div. 2)
     <C-Coverage Editorial>       这道题可以用dfs进行爆搜,但是在爆搜的时候要注意:是否同一个状态重复计数了比如dfs(i......
  • AtCoder Beginner Contest 281 A-F 题解
    比赛链接A-CountDown先这样,就这样。点击查看代码#include<cstdio>intn;intmain(){ scanf("%d",&n); for(inti=n;i>=0;i--)printf("%d\n",i); re......
  • AtCoder Beginner Contest 287 A-F 题解
    比赛链接A-Majority先这样再那样最后这样,就是这样。点击查看代码#include<cstdio>#include<algorithm>#include<cstring>usingnamespacestd;intn,a;char......