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. ...
随机推荐
- JSON parser error with double quotes
Use backslash charater \ to escape double quotes in JSON file as below example. { "myInfo" ...
- 安装Cygwin
如果你现在正在学习C语言,而你又不希望使用微软提供的任何C语言的任何编译器,那么你应该考虑一下GCC.GCC是运行于类UNIX系统下的编译器工具集,这又引出了另一个让人头疼的问题,你没有一台现成的装有 ...
- java.util.Hashtable源码分析
Hashtable实现一个键值映射的表.任何非null的object可以用作key和value. 为了能存取对象,放在表里的对象必须实现hashCode和equals方法. 一个Hashtable有两 ...
- ECMAScript布尔操作符
在ECMAScript中提供了Boolean()转换函数以及三个布尔操作符,这三个布尔操作符分别为逻辑非.逻辑与.逻辑或,这三个操作符通常用作于某些值的求反,比较模式等.学好这一点知识也非常的重要,奠 ...
- Apache虚拟主机设置
Apache支持两种虚拟主机,一种是基于IP地址的,一种是基于域名的. 基于IP地址的虚拟机现在使用的很少,它需要一台服务器需要拥有多个IP地址.基于域名的虚拟主机要求服务器有一个IP地址就可以了,只 ...
- C#调用金数据API
首先,吐槽一下金数据的API文档 http://help.jinshuju.net/articles/api-intro.html写的很粗糙啊...反正我是没太看明白 拿表单api举例,只告诉你了个地 ...
- oracle 11g实验五——触发器的使用
实验要求: 实验五 触发器的使用 实验目的 1. 理解触发器的概念.作用及分类: 2. 掌握触发器的创建.使用: 实验内容 1. 建立表orders:用于存储订单列表信息:表order_item ...
- Django数据操作
1.一个模型类代表数据库中的一个表,一个模型类的实例代表这个数据库表中的一条特定的记录. 2.管理器和查询集. 查询集QuerySet表示从数据库中取出来的对象的集合.它可以含有零个.一个或者多个过滤 ...
- java JDBC操作MySQL数据库
一,首先在MYSQL建立一个数据库,例如Geek99DB: create database Geek99DB; use Geek99DB; 然后建立一个表CustomerTab: create tab ...
- VM启动报错:Failed to lock the file
http://www.cnblogs.com/kristain/articles/2491966.html Reason: Failed to lock the fileGoogle 了一下, 在網路 ...