链接:https://www.nowcoder.com/acm/contest/79/E
来源:牛客网
题目描述
小欧在上代数课的时候,老师向大家提出了一个问题,不定方程 ax+by=c 的整数解存在的充要条件是什么。
聪明的小欧立即举手给出了老师一个完美的回答,放学后,老师叫住小欧给了他一个思考题。
给出正整数 a 和 b 的值以及两个序列 S 和 V, 求出最小代价的正整数 c 使得不定方程 ax+by=c 有解,且 c 必须满足以下条件:
1. 组成 c 的数字必须是序列 S 内的。
2. 每使用序列 S 内的一个数字 S i 就会消耗掉代价 V i。
3. 序列 S 内的数字使用次数不限。
4. c 的首位为 u, c的末位为 v。(u,v 也是序列 S 内的)
如果有多个代价一样小的答案,只需要 c 的字典序最小的那一个。
聪明的小欧立即举手给出了老师一个完美的回答,放学后,老师叫住小欧给了他一个思考题。
给出正整数 a 和 b 的值以及两个序列 S 和 V, 求出最小代价的正整数 c 使得不定方程 ax+by=c 有解,且 c 必须满足以下条件:
1. 组成 c 的数字必须是序列 S 内的。
2. 每使用序列 S 内的一个数字 S i 就会消耗掉代价 V i。
3. 序列 S 内的数字使用次数不限。
4. c 的首位为 u, c的末位为 v。(u,v 也是序列 S 内的)
如果有多个代价一样小的答案,只需要 c 的字典序最小的那一个。
输入描述:
第一行三个个整数 a,b,n (1 <= a, b <= 100000, 2 <= n <= 10)i
第二行 n 个整数 S
(0 <= Si
<= 9)i
第三行 n 个整数 V
(1 <= Vi
<= 1000)
最后一行两个整数 u,v(1 <= u <= 9, 0 <= v <= 9, u != v)
输出描述:
输出一行表示满足条件的 c 。
如果有多个输出字典序最小的。
如果不存在输出 -1 。
示例1
输入
10 15 2 2 0 1 1 2 0
输出
20
示例2
输入
17 17 4 0 1 2 7 1 1 1 1000 1 0
输出
1020
思路:对于0到1e5的每一个值建一个节点,每个数字对应一条边,u到v有一条数字为x的边当且仅当(u * 10 + x) % gcd(a, b) == v。想到这里,建图完毕直接跑个dij就行了。但是有一个问题,要输出字典序最小路径,正向可能不好记录,
可以反向建图跑最短路。反向图的起点值是0,连接所有 满足(w * 10 + v) % 10 == 0的w节点即可,但这个0与路径上普通的节点0是不同的,我们要将这个点特殊化一下,可以赋成一个独特的下标10001。最后求10001到u的最短路即可,更新路径
时根据决策记录上一个节点以及到达此节点的边。
1 #include2 #include 3 #include 4 #include 5 #include 6 #include 7 #include <string> 8 #include 9 #include 10 #include 11 #include 12 #include 13 #include <set> 14 #include