hdu 4294 数学分析+搜索
又要开始一段搜索的路程了。
最近看了这题,在网上看到一个结论,任何一个数倍数都能被不超过两个数字组成,假如一个数n个A%x=b,那么必然有m个A%=b那么此时n个A减去m个B就能够被x整除,那么此时就有了上述的结论,在配合上余数来进行一个搜索,就是把余下的数字作为一个状态来进行广搜。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<queue>
using std::queue;
int const N = ;
int const M = ;
int cnt[M],father[M],record[M];
char ans[M],tmp[M];
int n,k,a1,t1,e[N],c;
bool bfs()
{
queue<int> q;
while(!q.empty())q.pop();
for(int i=;i<c;i++)
{
if(!e[i]||cnt[e[i]%n])continue;
cnt[e[i]%n]=;
father[e[i]%n]=-;
record[e[i]%n]=e[i];
q.push(e[i]%n);
}
while(!q.empty())
{
int num=q.front();
q.pop();
if(a1>&&cnt[num]>a1)return false;
if(num==)return true;
for(int i=;i<c;i++)
{
int nt=(num*k+e[i])%n;
if(!cnt[nt])
{
cnt[nt]=cnt[num]+;
father[nt]=num;
record[nt]=e[i];
q.push(nt);
}
}
}
return false;
}
bool cmp()
{
if(a1==)return true;
if(t1>a1)return false;
if(t1<a1)return true;
for(int i=;i<t1;i++)
{
if(ans[i]>tmp[i])return true;
if(ans[i]<tmp[i])return false;
}
return false;
}
void over()
{
for(int i=;i<t1;i++)
ans[i]=tmp[i];
ans[t1]='\0';
a1=t1;
}
void display(int i)
{
tmp[cnt[i]-]=record[i]+'';
if(father[i]!=-)
display(father[i]);
}
int main()
{
while(scanf("%d %d",&n,&k)!=EOF)
{
a1=;
for(int i=;i<k;i++)
{
memset(cnt,,sizeof(cnt));
e[]=i,c=;
if(bfs())
{
display();
t1=cnt[];
if(cmp())over();
}
}
if(a1==)
for(int i=;i<k;i++)
{
for(int j=;j<i;j++)
{
memset(cnt,,sizeof(cnt));
e[]=j,e[]=i,c=;
if(bfs())
{
display();
t1=cnt[];
if(cmp())over();
}
}
}
for(int i=;i<a1;i++)printf("%c",ans[i]);
printf("\n");
}
return ;
}
hdu 4294 数学分析+搜索的更多相关文章
- HDU 4294 Multiple(搜索+数学)
题意: 给定一个n,让求一个M,它是n个倍数并且在k进制之下 M的不同的数字最少. 思路: 这里用到一个结论就是任意两个数可以组成任何数的倍数.知道这个之后就可以用搜索来做了.还有一个问题就是最多找n ...
- hdu 4294(bfs)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4294 思路:题目的意思是说,给你n,k,则求出n的正整数倍数,使得这个数字在k进制下表示的时候需要的不 ...
- hdu 5468(莫比乌斯+搜索)
hdu 5468 Puzzled Elena /*快速通道*/ Sample Input 5 1 2 1 3 2 4 2 5 6 2 3 4 5 Sample Output Case #1: ...
- HDU 4499.Cannon 搜索
Cannon Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others)Total Subm ...
- HDU 1045 (DFS搜索)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1045 题目大意:在不是X的地方放O,所有O在没有隔板情况下不能对视(横行和数列),问最多可以放多少个 ...
- HDU 1180 (BFS搜索)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1180 题目大意:迷宫中有一堆楼梯,楼梯横竖变化.这些楼梯在奇数时间会变成相反状态,通过楼梯会顺便到达 ...
- HDU 2531 (BFS搜索)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2531 题目大意: 你的身体占据多个点.每次移动全部的点,不能撞到障碍点,问撞到目标点块(多个点)的最 ...
- HDU 1026 (BFS搜索+优先队列+记录方案)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1026 题目大意:最短时间内出迷宫.迷宫里要杀怪,每个怪有一定HP,也就是说要耗一定时.输出方案. 解 ...
- HDU 1312 (BFS搜索模板题)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1312 题目大意:问迷宫中有多少个点被访问. 解题思路: DFS肯定能水过去的.这里就拍了一下BFS. ...
随机推荐
- hdu 1250 Hat's Fibonacci(高精度数)
// 继续大数,哎.. Problem Description A Fibonacci sequence is calculated by adding the previous two membe ...
- STL容器与配接器
STL容器包括顺序容器.关联容器.无序关联容器 STL配接器包括容器配接器.函数配接器 顺序容器: vector 行为类似于数组,但可以根据要求 ...
- sgu 104 Little Shop of Flowers
经典dp问题,花店橱窗布置,不再多说,上代码 #include <cstdio> #include <cstring> #include <iostream> #i ...
- HDOJ 1422 重温世界杯 -- 动态规划
题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=1422 Problem Description 世界杯结束了,意大利人连本带利的收回了法国人6年前欠他们 ...
- nodejs的调试
js的调试始终是一个比较麻烦也是比较困难的事情,从最原始的alert调试,到火狐的firebug工具,在到后来各个浏览器厂商的调试工具.调试工具的发展历程,也可以看出由JS构建的业务和技术逻辑越来越复 ...
- 使用Notepad++将多行数据合并成一行
1.按Ctrl+F,弹出“替换”的窗口: 2.选择“替换”菜单: 3.“查找目标”内容输入为:\r\n: 4.“替换为”内容为空: 5.“查找模式”选择为正则表达式: 6.设置好之后,点击“全部替换” ...
- CSS弹性盒模型 box-flex
目前没有浏览器支持boc-flex属性. Firefox支持代替的-moz-box-flex属性 Safari.Opera以及Chrome支持替代的-webkit-box-flex属性 box-fle ...
- Window_Open详解
Window_Open详解 引:Window_Open详解一.window.open()支持环境:JavaScript1.0+/JScript1.0+/Nav2+/IE3+/Opera3+ 二. ...
- 支持阻塞操作和轮询操作的globalfifo设备驱动代码分析以及测试代码
#include <linux/module.h> #include <linux/types.h> #include <linux/fs.h> #include ...
- 在Ubuntu Linux下怎样安装QQ
最近好多人在吐槽Linux下上QQ简直就是煎熬,网页版的不方便,网上各种版本的QQ要么是功能不全.要么是界面丑到爆,要么是运行不稳定.那么这次为大家带来一个功能完整.运行稳定的wineQQ安装过程. ...