比赛链接:传送门

题目大意:

  求一个十进制大数S(有部分数位为"?")能被N整除时的最小值,如果没有办法被N整除,输出"*"。

思路:

  一个数位上的数值增加1后,对N取模时的贡献可以预处理出来。设为mod[MAX_N]。

  先把整个十进制大数置成最小的合法状态,存在res中。(问号置为0或1)

  此时的大数对N取模的值是可以计算的。设为val。

  如果val为0,res中已经是最大的答案。

  如果val不为0,从最右边的"?"开始往左枚举"?"。

  维护一个vis数组,vis[k] = true表示已经访问过的问号当中,至少有一种填法使得整个大数对N取模的余数为k。

  如果vis[N-val] = true,说明找到了一种填法。因为是从右往左枚举"?"的,第一次得到vis[N-val] = true时,几乎就是最小的了。考虑到当前数位填的数相同时,可能在当前的"?"右边的"?"填数不同,可能导致最小值不同,所以要额外judge一下。更新vis数组时,记录路径,在vis[N-val] = true时,反演路径,对应修改res中对应数位的数值即可。

代码:

#include <bits/stdc++.h>

using namespace std;
const int MAX_N = + ;
const int INF = 0x3f3f3f3f; int N;//取模
int len;//S的长度
char S[MAX_N], res[MAX_N];
int mod[MAX_N];//数位取模的值
int val;//work构造模N为val的值
bool vis[MAX_N], tmpvis[MAX_N];//vis[i]能否构造模N为i的值
int fat[MAX_N], fatnum[MAX_N], fatlog[MAX_N];//记录路径 inline bool judge(int pos, int l, int n, int f)
{
if (l == fatlog[fat[pos]]) {
return n < fatnum[fat[pos]];
}
return l < fatlog[fat[pos]];
} bool work()
{
memset(vis, false, sizeof vis);
vis[] = true;
fat[] = -;
fatnum[] = ;
fatlog[] = ;
if (vis[val])
return true; for (int i = ; i <= len; i++) {
int p = len-i;
if (isdigit(S[p]))
continue;
memcpy(tmpvis, vis, sizeof vis);
for (int j = +(i==len); j <= ; j++) {
for (int k = ; k < N; k++) if(vis[k]) {
int pos = ( k+mod[i]*(j - (i==len)) )%N;
if (!tmpvis[pos] || judge(pos, i, j, k)) {
tmpvis[pos] = true;
//可能同时有很多边找到了?不可能。
fat[pos] = k;
fatnum[pos] = j;
fatlog[pos] = i;
}
}
if (tmpvis[val])
return true;
}
memcpy(vis, tmpvis, sizeof vis);
}
return false;
} int main()
{
// freopen("testdata.txt", "r", stdin);
while (~scanf("%s%d", S, &N)) { len = strlen(S);
mod[] = %N;
for (int i = ; i <= len; i++) {
mod[i] = mod[i-]*%N;
} val = ;
for (int i = ; i <= len; i++) {
int p = len-i;
res[p] = S[p];
if (isdigit(S[p])) {
val += (S[p]-'')*mod[i]%N, val %= N;
}
else if (S[p] == '?') {
if (i == len) {
val += mod[i]%N, val %= N;
res[p] = '';
}
else {
res[p] = '';
}
}
}
val = (N-val)%N;
res[len] = '\0';
// printf("%s\n", res); bool ans = work();
if (!ans) {
puts("*");
continue;
} int tmp = val;
while (fat[tmp] != -) {
int f = fat[tmp];
int l = fatlog[tmp];
int n = fatnum[tmp];
int pos = len-l;
res[pos] = n + '';
tmp = f;
}
// printf("%s\n", S);
printf("%s\n", res);
// puts("");
}
return ;
}
/*
1??????????????????????????????? 2 ???????????????????????????????1 2 ?294?? 17 9999??????? 81
*/

Gym101889E. Enigma(bfs+数位)的更多相关文章

  1. Gym - 101889E Enigma(数位填数+记忆化)

    https://cn.vjudge.net/problem/Gym-101889E 1??????????????????????????????? 2 10000000000000000000000 ...

  2. 【数位dp】Enigma

    http://codeforces.com/gym/101889 E 与一般数位dp不同,保存的是能否满足条件,而非记录方案数 代码: #include <iostream> #inclu ...

  3. hdu3709 Balanced Number (数位dp+bfs)

    Balanced Number Problem Description A balanced number is a non-negative integer that can be balanced ...

  4. 【每日dp】 Gym - 101889E Enigma 数位dp 记忆化搜索

    题意:给你一个长度为1000的串以及一个数n 让你将串中的‘?’填上数字 使得该串是n的倍数而且最小(没有前导零) 题解:dp,令dp[len][mod]为是否出现过 填到第len位,余数为mod 的 ...

  5. BFS+状态压缩 hdu-1885-Key Task

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1885 题目意思: 给一个矩阵,给一个起点多个终点,有些点有墙不能通过,有些点的位置有门,需要拿到相应 ...

  6. hdu1429之BFS

    胜利大逃亡(续) Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total S ...

  7. 搜索入门_简单搜索bfs dfs大杂烩

    dfs题大杂烩 棋盘问题  POJ - 1321 和经典的八皇后问题一样.  给你一个棋盘,只有#区域可以放棋子,同时同一行和同一列只能有一个棋子. 问你放k个棋子有多少种方案. 很明显,这是搜索题. ...

  8. HDU 1226 超级密码(数学 bfs)

    传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1226 超级密码 Time Limit: 20000/10000 MS (Java/Others)    ...

  9. HDU 1043 Eight 【经典八数码输出路径/BFS/A*/康托展开】

    本题有写法好几个写法,但主要思路是BFS: No.1 采用双向宽搜,分别从起始态和结束态进行宽搜,暴力判重.如果只进行单向会超时. No.2 采用hash进行判重,宽搜采用单向就可以AC. No.3 ...

随机推荐

  1. Bugku-CTF之Web5(JSPFUCK??????)

    Day10 web5 JSPFUCK??????答案格式CTF{**} http://123.206.87.240:8002/web5/ 字母大写    

  2. Kubernetes 路由问题&网络问题

    error 信息: kubectl 获取node的host地址 kubectl get pods -n $namespace -o wide 或者在Kubernetes的service中进行查看 ku ...

  3. Nginx教程---03.Nginx日志切割

    Nginx的定时任务与自动切割 明确: 如果这个网站的访问量比较大,那么一天下来 nginx日志可能会特别的大,所以当出现这种情况呢,如果 把每天的日志都存在同一个日志文件里,会使你的日志文件大到让你 ...

  4. Pandas 基础(7) - Group By 分组的相关知识

    首先, 引入这节需要的 csv 文件 (已上传) import pandas as pd city_df = pd.read_csv('/Users/rachel/Sites/pandas/py/pa ...

  5. hdu 6010 Daylight Saving Time 泰勒公式

    Daylight Saving Time Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Oth ...

  6. eclipse 运行 mapreduce程序报错 No job jar file set. User classes may not be found. See JobConf(Class) or JobConf#setJar(String).

    报错信息 17/07/06 17:00:27 WARN mapred.JobClient: Use GenericOptionsParser for parsing the arguments. Ap ...

  7. [poj P2411] Mondriaan's Dream

    [poj P2411] Mondriaan's Dream Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 18023   A ...

  8. 牛客网第4场A

    链接:https://www.nowcoder.com/acm/contest/142/A 来源:牛客网 题目描述 A ternary , , or . Chiaki has a ternary in ...

  9. 20175227张雪莹 2018-2019-2 《Java程序设计》第六周学习总结

    20175227张雪莹 2018-2019-2 <Java程序设计>第六周学习总结 教材学习内容总结 第七章 内部类与异常类 内部类:在一个类中定义另一个类:包含内部类的类为外嵌类 内部类 ...

  10. WIFI 万能钥匙万玉权:团队之中要有跨三界之外的“闲人” [转]

      在团队规模较小时,很多事情都可以变得特别简单.比如架构的选择,大部分情况下,最初的架构越简单越好,随着业务的演进,架构才不断完善. 连尚网络经历了从几人到上百人的管理过程,其自主创新研发的产品 W ...