Gym101889E. Enigma(bfs+数位)
比赛链接:传送门
题目大意:
求一个十进制大数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+数位)的更多相关文章
- Gym - 101889E Enigma(数位填数+记忆化)
https://cn.vjudge.net/problem/Gym-101889E 1??????????????????????????????? 2 10000000000000000000000 ...
- 【数位dp】Enigma
http://codeforces.com/gym/101889 E 与一般数位dp不同,保存的是能否满足条件,而非记录方案数 代码: #include <iostream> #inclu ...
- hdu3709 Balanced Number (数位dp+bfs)
Balanced Number Problem Description A balanced number is a non-negative integer that can be balanced ...
- 【每日dp】 Gym - 101889E Enigma 数位dp 记忆化搜索
题意:给你一个长度为1000的串以及一个数n 让你将串中的‘?’填上数字 使得该串是n的倍数而且最小(没有前导零) 题解:dp,令dp[len][mod]为是否出现过 填到第len位,余数为mod 的 ...
- BFS+状态压缩 hdu-1885-Key Task
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1885 题目意思: 给一个矩阵,给一个起点多个终点,有些点有墙不能通过,有些点的位置有门,需要拿到相应 ...
- hdu1429之BFS
胜利大逃亡(续) Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total S ...
- 搜索入门_简单搜索bfs dfs大杂烩
dfs题大杂烩 棋盘问题 POJ - 1321 和经典的八皇后问题一样. 给你一个棋盘,只有#区域可以放棋子,同时同一行和同一列只能有一个棋子. 问你放k个棋子有多少种方案. 很明显,这是搜索题. ...
- HDU 1226 超级密码(数学 bfs)
传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1226 超级密码 Time Limit: 20000/10000 MS (Java/Others) ...
- HDU 1043 Eight 【经典八数码输出路径/BFS/A*/康托展开】
本题有写法好几个写法,但主要思路是BFS: No.1 采用双向宽搜,分别从起始态和结束态进行宽搜,暴力判重.如果只进行单向会超时. No.2 采用hash进行判重,宽搜采用单向就可以AC. No.3 ...
随机推荐
- Windows server 2016安装Docker EE
Windows server 2016安装Docker EE 下载 windows server 2016 180天评估版本. 地址:https://www.microsoft.com/en-us/e ...
- Spring Boot Log4j2 日志学习
简介 Java 中比较常用的日志工具类,有: Log4j. SLF4j. Commons-logging(简称jcl). Logback. Log4j2(Log4j 升级版). Jdk Logging ...
- C#中get和set
释一: 属性的访问器包含与获取(读取或计算)或设置(写)属性有关的可执行语句.访问器声明可以包含 get 访问器或 set 访问器,或者两者均包含.声明采用下列形式之一: get {} set {} ...
- 用jQuery实现参数自定义的文字跑马灯效果
一,明确需求 基本需求:最近在工作中接到一个新需求,简单来说就是实现一行文字从右到左跑马灯的效果,并且以固定的时间间隔进行循环. 原本这是一个很容易实现的需求,但是难点是要求很多参数得是用户可自行设置 ...
- SpringBoot与数据访问
pom依赖: <dependency> <groupId>org.springframework.boot</groupId> <artifactId> ...
- Probability和Likelihood的区别
Bayes for Beginners: Probability and Likelihood 好好看,非常有用. 以前死活都不理解Probability和Likelihood的区别,为什么这两个东西 ...
- Node.js的缺陷
Node.js最大的优点是事件机制,一切皆在回调中触发(不阻塞).我想缺点或许有正在于此,方法没有返回值,而只能在回调中使用返回结果,会导致事件回调嵌套,代码结构很差. 在jQuery中有一套很好的机 ...
- webpack2与promise在IE环境下
webpack2好像说是要自己编译es6,但是结果不是很理想,es6的箭头函数他就没有编译,所以目前还是先用babel来转换吧, 之前用的ajax是axios,底层是promise,但是promise ...
- 使用Metasploit渗透攻击windows系统(一)
攻击机:kaili ip:192.168.80.157 目标机:win7 IP:192.168.80.158 这里用两种方法去创建meterpreter会话: 1)利用kali中的msfvenom生成 ...
- 脚本自动部署及监控 web
1.编写脚本自动部署反向代理.web.nfs: I.部署nginx反向代理两个web服务,调度算法使用加权轮询 II.所有web服务使用共享存储nfs,保证所有web都对其有读写权限,保证数据一致性: ...