D - Small Multiple

题目传送门

Time limit : 2sec / Memory limit : 256MB

Score : 700 points

Problem Statement

Find the smallest possible sum of the digits in the decimal notation of a positive multiple of K.

Constraints

2≤K≤105
K is an integer.
  • 1
  • 2
  • 3

Input

Input is given from Standard Input in the following format:

K
  • 1
  • 2
  • 3
  • 4

Output

Print the smallest possible sum of the digits in the decimal notation of a positive multiple of K.
  • 1
  • 2

Sample Input 1

6

Sample Output 1

3

12=6×2 yields the smallest sum.

Sample Input 2

41

Sample Output 2

5

11111=41×271 yields the smallest sum.

Sample Input 3

79992

Sample Output 3

36

Solution

疯狂从数的角度出发,找了一下午规律而毫无结果的我……桑森。

最后发现,这题竟然可以写最短路??

贴一发Atcoder的官方题解:英文题解_传送门

这种方法十分巧妙——

首先,让我们转换一下思维,从数到图。先说说操作,对于任意一个0..k-1之间的整数x,将x看做一个点。由于从x出发可以引出两项基本操作:

(1)x*=10,此时x的各位数字和不发生改变,此操作可以转换成从x到x*10%k连一条有向边,权值0;

(2)x++,此时x的各位数字和也加一,此操作可以转换成从x到(x+1)%k连一条有向边,权值1。

这样图中有k个点(0..k-1),2*k条边。

然后, 关于合理性和含义,阐释如下。所有对k同余的数目可以看做图中的同一个点,当我们从点1出发,沿着构造好的有向图的边走到0点时,就相当于走到了一个k的正整数倍数的点值,不妨设其为ak。而这一路走来经过的所有边的权值之和,也就是逐步或加1或加0得到的总和,正是ak的各位数值总和减一。(这一路走来是经过了连接点与点的路径,而出发点是1不是0;出发点显然不能与终点相同,故不能是0;若出发点不是1而是1后面的点,难免会忽略了一些在那后面的点之前的可能的比较优的路径。因此应从1到0走一趟)。易知此有向图的最短路径长度减一就是答案。

(3)k<=1e5,点数k,边数2k,跑dijkstra即可。

#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int N = 100001;
struct node{
int v,nxt,cost;
}edge[N<<1];
int head[N],k,tot;
int q[N*8],l,r,u,v;
int dist[N];
void addEdge(int u,int v,int val) {
edge[++tot].v=v;
edge[tot].cost=val;
edge[tot].nxt=head[u];
head[u]=tot;
}
int main() {
//freopen("out.txt","w",stdout);
scanf("%d",&k);
for (int i=0;i<k;++i) {
addEdge(i,i+1==k?0:i+1,1);
addEdge(i,i*10%k,0);
dist[i]=N;
}
dist[1]=0;
l=-1;
r=0;
q[0]=1;
while (l<r) {
u = q[++l];
for (int i=head[u];i;i=edge[i].nxt) {
v=edge[i].v;
if (dist[u]+edge[i].cost<dist[v]) {
dist[v]=dist[u]+edge[i].cost;
q[++r]=v;
}
}
}
printf("%d\n",dist[0]+1);
return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41

UPC 6616 Small Mulitple的更多相关文章

  1. UPC 2170 D Equal Is Not Really Equal (欧拉路径)

    题目链接:http://acm.upc.edu.cn/problem.php?id=2170 题意:给出一个字符串,比如ABACA,在这个串里,AB.BA.AC.CA各出现一次.若存在另外一个串,里面 ...

  2. UPC 2224 Boring Counting (离线线段树,统计区间[l,r]之间大小在[A,B]中的数的个数)

    题目链接:http://acm.upc.edu.cn/problem.php?id=2224 题意:给出n个数pi,和m个查询,每个查询给出l,r,a,b,让你求在区间l~r之间的pi的个数(A< ...

  3. UPC 2224 Boring Counting ★(山东省第四届ACM程序设计竞赛 tag:线段树)

    [题意]给定一个长度为N的数列,M个询问区间[L,R]内大于等于A小于等于B的数的个数. [题目链接]http://acm.upc.edu.cn/problem.php?id=2224 省赛的时候脑抽 ...

  4. 第一节 UPC 码

    UPC码(Universal Product Code)是最早大规模应用的条码,其特性是一种长度固定.连续性的条码,目前主要在美国和加拿大使用,由於其应用范围广泛,故又被称万用条码. UPC码仅可用来 ...

  5. UPC 2959: Caoshen like math 这就是个水题

    http://acm.upc.edu.cn/problem.php?id=2959 这就是个水题,之所以要写这个题是感觉很有纪念意义 用力看就是盲……23333333333333333 这个题就是最小 ...

  6. opencart3产品页调用upc/数量等信息

    opencart3产品页默认只调用标题.价格.型号等几个数据,如果想要调用更多的参数要如何操作呢?跟着ytkah一起来看看吧.首先打开/catalog/model/catalog/product.ph ...

  7. 一维码UPC E简介及其解码实现(zxing-cpp)

    UPC(Universal Product Code)码是最早大规模应用的条码,其特性是一种长度固定.连续性的条  码,目前主要在美国和加拿大使用,由于其应用范围广泛,故又被称万用条码. UPC码仅可 ...

  8. 一维码UPC A简介及其解码实现(zxing-cpp)

    UPC(Universal Product Code)码是最早大规模应用的条码,其特性是一种长度固定.连续性的条  码,目前主要在美国和加拿大使用,由于其应用范围广泛,故又被称万用条码. UPC码仅可 ...

  9. (zxing.net)一维码UPC E的简介、实现与解码

    UPC(Universal Product Code)码是最早大规模应用的条码,其特性是一种长度固定.连续性的条  码,目前主要在美国和加拿大使用,由于其应用范围广泛,故又被称万用条码. UPC码仅可 ...

随机推荐

  1. CF1110D Jongmah

    题目地址:CF1110D Jongmah 约定:称形如 \([a-1,a,a+1]\) 这样的三元组为关于 \(a\) 的顺子,形如 \([a,a,a]\) 这样的三元组为关于 \(a\) 的对子. ...

  2. np.nonzero()函数用法

    返回数组中不为0的元素的下标. 数组中元素可为布尔.整型和浮点型,返回值为元祖 一.一维数组 1.数组元素为布尔类型 a=np.array([True,False,True,False]) b=np. ...

  3. 【转】python 面向对象(进阶篇)

    [转]python 面向对象(进阶篇) 上一篇<Python 面向对象(初级篇)>文章介绍了面向对象基本知识: 面向对象是一种编程方式,此编程方式的实现是基于对 类 和 对象 的使用 类 ...

  4. 【转】python模块分析之unittest测试(五)

    [转]python模块分析之unittest测试(五) 系列文章 python模块分析之random(一) python模块分析之hashlib加密(二) python模块分析之typing(三) p ...

  5. 设计模式C++学习笔记之二十(完结篇 & 面向对象原则)设计模式C++实例下载

      Prototype(原型模式) 20.1.解释 概念:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象. main(),客户 ICloneableNow,只有一个接口Clone CM ...

  6. 设计模式C++学习笔记之十五(Composite组合模式)

      15.1.解释 概念:将对象组合成树形结构以表示“部分-整体”的层次结构.Composite使得用户对单个对象和组合的使用具有一致性. main(),客户 CCorpNode,抽象基类,实现基本信 ...

  7. hibernate框架学习之数据模型-POJO

    Hibernate数据模型用于封装数据,开发时候需要遵从如下规范:1)提供公共无参的构造方法(可使用自动生成的)如果使用投影技术,一定要显式声明公共无参的构造方法2)提供一个标识属性,作为对象的主键, ...

  8. web-font 个人学习小总结

    个人觉得 web-font  分为两种: 第一种就是真正文本字体,客户端没有安装的字体通过远程加载字体来实现特殊字体提高用户体验: icodon.com : http://icodon.com/goo ...

  9. 前端 ---client、offset、scroll系列

    client.offset.scroll系列   1.client系列 代码如下: <!DOCTYPE html> <html> <head> <meta c ...

  10. echo和重定向

    命令: echo 作用: echo有重复的意思,会在终端中显示参数指定的文字,通常会和重定向联合使用 使用: echo 文字内容 例子: 在终端中显示hello echo hello 命令: > ...