题意:

给定一个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. String和bytes的编码转换

    import java.io.UnsupportedEncodingException; import java.nio.charset.Charset; /** * @author 作者 E-mai ...

  2. Objective-C property属性解析

    @interface … @property (原子性,可写性,内存管理) id name; @end 原子性:    nonatomic, atomic   默认atomic 可写性:    rea ...

  3. 常用machine learning数据集

    ImageNet:非商业化的可视化大数据 截止到2015年5月1日,ImageNet数据库拥有超过1500万的图像. cifar10:10类物体识别数据集 数据集中包含60,000幅32*32图像,共 ...

  4. http server v0.1_http_parse.c

    #include <stdio.h> #include <string.h> #include <stdlib.h> #include "mime.h&q ...

  5. Qt学习笔记网络(URL和下载的功能都有)

    http://www.cnblogs.com/li-peng/p/3656613.html

  6. Qt动画与Qt坐标小记

    Qt动画 转载自: <http://jingyan.baidu.com/article/154b46315757b628ca8f4116.html> 和  <http://blog. ...

  7. android——彻底关闭——应用程序

    最近学习做android的游戏开发时候,发现一个关于android退出时不能彻底关闭的问题,比如:一个程序里new 出了N多个Thread,这样在退出程序的可能不能完全关闭,最后发现,只用finish ...

  8. System.in.read()

     用读取键盘输入必须构建       1.输入流   System.in;       2.字符输入流   InputStreamReader       3.缓存输入流   BufferedRead ...

  9. 遍历、显示ftp下的文件夹和文件信息

    今天做了通过ftp读取ftp根目录下的所有文件夹和文件,嵌套文件夹查询,总共用到了一下代码: 1.FtpFile_Directory package com.hs.dts.web.ftp; impor ...

  10. hdu 2289 Cup (二分法)

    http://acm.hdu.edu.cn/showproblem.php?pid=2289 二分法解题. 这个题很恶心...一开始测试样例都不能过,这个π一开始取3.1415926结果是99.999 ...