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 ...
随机推荐
- https连接器
非对称性加密:A生成一份公私钥,将公钥交给需要进行数据传输的B,B发送数据时先用公钥对数据进行加密,然后发送给A,再由A使用私钥进行解密. 但存在漏洞即B如何确认公钥是由A提供的.因此需要一个第三方机 ...
- git将本地项目上传码云
1.首先在码云新建项目. 2.使用git bash工具,进入本地项目所在的文件夹. 3.执行命令 git init,初始化本地git仓库 4.执行命令 git remote add [short-na ...
- android中SELINUX规则分析和语法简介【转】
本文转载自:https://blog.csdn.net/LoongEmbedded/article/details/62430039 1. SELINUX是可以理解为一种Android上面的安全机制, ...
- js 数组原型
Array.isArray( Array.prototype ) // A. true // B. false // C. error // D. other 答案是A. 其实 Array.proto ...
- ehcache 简介和基本api使用
文章转载自: https://blog.csdn.net/zhouzhiwengang/article/details/59838105 1.ehcahce简介 在开发高并发量,高性能的网站应用系统时 ...
- Linux下Java环境安装
本节主要讲解Linux(Centos 6.5)下Java环境的安装 1. 卸载机器上默认安装的JDK 在Linux环境下一般会默认安装jdk,为了自己项目的开发部署,一般情况要重新装jdk,而且自己装 ...
- Crisp String CodeForces - 1117F (状压)
#include <iostream> #include <algorithm> #include <cstdio> #include <math.h> ...
- Highcharts 时间格式化函数
1.函数构造: Highcharts.dateFormat(String format, [Number time], [Boolean capitalize]) 2.参数列表: Strin ...
- CSS设置表格TD宽度布局
使用表格布局时,对单元格的宽度控制很伤脑筋,所以查阅资料整理如下: 一.表格布局table-layout 语法: table-layout : auto | fixed 取值: auto : 大多数 ...
- win10下vs2015编译的程序如何运行在win7等系统(无需安装Redistributable)
最近新写的程序要做beta测试,在做绿色版(免安装版)时遇到了问题,vs2015做的项目本以为像之前的vs版本一样把msvcrXXX.dll还有另外几个运行时库都放到exe旁边即可,然并卵...,在w ...