题意:

给定一个n,让求一个M,它是n个倍数并且在k进制之下 M的不同的数字最少。

思路:

这里用到一个结论就是任意两个数可以组成任何数的倍数。知道这个之后就可以用搜索来做了。还有一个问题就是最多找n+1个数,因为由鸽巢原理,这n+1个数当中模上n一定有一个一同的。所以他们一减就是答案。如果找到直接是它的倍数的话,就直接返回。

搜索时保存的是它的余数,如果余数为0 的时候直接返回。还有就是在搜索中并不是直接找余数相同的两个数。而是找余数为0的。当暴力不同元素个数为2的时候,这时候已经算是找余数刚开始是由两个数相减得到的了。

#include <bits/stdc++.h>

using namespace std;
const int maxn = 10005;
int n, k;
int num[2];
int fa[maxn];
char st[maxn];
bool bfs(int nums)
{
bool vis[maxn];
memset(vis, false, sizeof(vis));
queue<int> Q;
Q.push(0);
while (!Q.empty())
{
int u = Q.front(); Q.pop();
for (int i = 0; i < nums; i++)
{
int v = (u * k + num[i]) % n;
if (!vis[v] && !(u == 0 && num[i] == 0))
{
fa[v] = u;
st[v] = num[i] + '0';
vis[v] = true;
if (v == 0) return true;
Q.push(v);
}
}
}
return false;
}
bool cmp(string a, string b)
{
int len1 = a.length();
int len2 = b.length();
if (len1 != len2) return len1 < len2;
for (int i = 0; i < len1; i++)
if (a[i] != b[i]) return a[i] < b[i];
return 0;
} bool get_str(int u, string &str)
{
if (fa[u] != 0) get_str(fa[u], str);
str = str + st[u];
}
void update_ans(string &ans, string &str)
{
str = "";
get_str(0, str);
if (ans == "a" || cmp(str, ans))
ans = str;
}
int main()
{
while (~scanf("%d%d", &n, &k))
{
string ans = "a";
string str = "";
for (int i = 1; i < k; i++)
{
num[0] = i;
if (bfs(1))//找右一个数字构成的数
update_ans(ans, str);
}
if (ans == "a")//如果找不到一个的,就找两个的
{
for (int i = 0; i < k; i++)
{
for (int j = i + 1; j < k; j++)
{
num[0] = i;
num[1] = j;
if (bfs(2))
update_ans(ans, str);
}
}
}
cout << ans << endl;
}
return 0;
}

  

HDU 4294 Multiple(搜索+数学)的更多相关文章

  1. hdu 4294 数学分析+搜索

    又要开始一段搜索的路程了. 最近看了这题,在网上看到一个结论,任何一个数倍数都能被不超过两个数字组成,假如一个数n个A%x=b,那么必然有m个A%=b那么此时n个A减去m个B就能够被x整除,那么此时就 ...

  2. hdu 4294 Multiple

    思路: 首先给出一个结论,就是最多用两个数就可以表示任何数的倍数. 证明 :对于一个数字a,可以构造出的数字有 a,aa,aaa,aaaa,aaaaa,…… 每一个数对于n都有一个余数,余数最多有n个 ...

  3. HDU 4499.Cannon 搜索

    Cannon Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others)Total Subm ...

  4. hdu 4294(bfs)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4294 思路:题目的意思是说,给你n,k,则求出n的正整数倍数,使得这个数字在k进制下表示的时候需要的不 ...

  5. 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: ...

  6. poj 1426 Find The Multiple 搜索进阶-暑假集训

    E - Find The Multiple Time Limit:1000MS     Memory Limit:10000KB     64bit IO Format:%I64d & %I6 ...

  7. hdu 5312 Sequence(数学推导——三角形数)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5312 Sequence Time Limit: 2000/2000 MS (Java/Others)  ...

  8. HDU 1045 (DFS搜索)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1045 题目大意:在不是X的地方放O,所有O在没有隔板情况下不能对视(横行和数列),问最多可以放多少个 ...

  9. HDU 1180 (BFS搜索)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1180 题目大意:迷宫中有一堆楼梯,楼梯横竖变化.这些楼梯在奇数时间会变成相反状态,通过楼梯会顺便到达 ...

随机推荐

  1. Tomcat,Weblogic,WebSphere,JBoss四种服务器简单对比

    1,tomcat是Servlet容器,支持JSP.Servlet.JDBC等J2EE关键技术,常用于tomcat开发基于数据库.Servlet和JSP页面的Web应用.2,tomcat不是EJB容器, ...

  2. Java IO学习总结

    Java IO流学习总结 Io流的内容比较多 ,大致可以分为字节流和字符流,其中为了提高效率又用到了缓冲区. Java流操作有关的类或接口: 流的概念和作用 流是一组有顺序的,有起点和终点的字节集合, ...

  3. Phonegap 3.0 获取当前地址位置

    新版本的cordova 3.0 中,使用官方的示例可直接获取当前手机的地理位置,前提是手机开启了gps,或可联网. 获取到的是经纬度坐标值等信息,可通过google api 实现通过经纬度获取当前地理 ...

  4. NEURAL NETWORKS, PART 3: THE NETWORK

    NEURAL NETWORKS, PART 3: THE NETWORK We have learned about individual neurons in the previous sectio ...

  5. MYSQLl防注入

    1.简单sql防注入 简述: 所谓SQL注入式攻击,就是攻击者把SQL命令插入到Web表单的输入域或页面请求的查询字符串,欺骗服务器执行恶意的SQL命令. 在某些表单中,用户输入的内容直接用来构造(或 ...

  6. 3.2 java中堆栈(stack)和堆(heap)(还在问静态变量放哪里,局部变量放哪里,静态区在哪里.....进来)

    (1)内存分配的策略 按照编译原理的观点,程序运行时的内存分配有三种策略,分别是静态的,栈式的,和堆式的. 静态存储分配是指在编译时就能确定每个数据目标在运行时刻的存储空间需求,因而在编 译时就可以给 ...

  7. Android MAVEN项目标准目录结构

    1.标准目录结构: src -main      –bin 脚本库      –java java源代码文件      –resources 资源库,会自动复制到classes目录里      –fi ...

  8. -_-#flash播放器自适应

    设置断点,几个断点下的固定布局

  9. @repository注解

    Spring的注解形式:@Repository.@Service.@Controller,它们分别对应存储层Bean,业务层Bean,和展示层Bean. @Repository.@Service.@C ...

  10. HDU-4952 Number Transformation

    http://acm.hdu.edu.cn/showproblem.php?pid=4952 Number Transformation Time Limit: 2000/1000 MS (Java/ ...