hdu1664 bfs+余数判重
input
n 不超过50个例子,n==0结束输入
Sample Input
output
最少个不同数字的n的倍数的x,若不同数字个数一样,输出最小的x
Sample Output
根据数论里面的知识点:
对于任意的整数 n ,必然存在一个由不多于两个的数来组成的一个倍数。 因为 a ,aa , aaa…… 取 n+1 个,则由鸽笼原理,必有两个模 n 余数相同,相减即得 n 的倍数 m 。而 m 只由 a 、 0 组成。
#include <bits/stdc++.h>
#include <cstdio>
#include <queue>
#include <cstring>
#include <iostream>
#include <cstdlib>
#include <algorithm>
#include <vector>
#include <map>
#include <set>
#include <ctime>
#include <cmath>
#include <cctype>
#include <string>
#include <bitset>
#define MAX 65600
#define LL long long
#define uint unsigned short
using namespace std;
int cas=,T,n;
struct node1
{
int i,r;
};
char v1[MAX][];
int bfs1()
{
int step=,d=;
queue<node1>q[];
memset(v1,,sizeof(v1[])*n);
for(int i=;i<;i++) { q[].push((node1){i,i%n});v1[i%n][i]=; }
while(!q[d].empty()) //两个队列bfs,一个队列存一步里面走的
{
while(!q[d].empty())
{
node1 u=q[d].front();q[d].pop();
if(u.r==)
{
for(int i=;i<step;i++) printf("%d",u.i);
printf("\n");
return ;
}
node1 v;
v.r=(u.r*+u.i)%n;
if(v1[v.r][u.i]) continue;
v.i=u.i;q[d^].push(v);
v1[v.r][u.i]=;
}
step++;
d^=;
}
return ;
}
struct node
{
uint r,i,a,b; //a,b是两个不同的数字且a<b<10,r是余数,i是当前取的数,输出时要用
int fa; //父结点,查找路径用
};
node q[MAX*];
char v[MAX][];
uint idx(uint &a,uint&b) { return (b*b-b)/+a; }
void init(int &end) //初始化队列,一次将所有的入队用的内存太多,也可以分成45次bfs()
{
for(int i=;i<;i++) //从小到大入队
{
int a=i/,b=i%; //a是个位,b是十位
if(a==b)//a,b相同时可以是550 551 552 553 554 556 557 558 559
{
for(int j=;j<;j++)
{
if(a==j) continue;
node&u=q[end];
u.i=i;u.r=i%n;
u.a=min(a,j);u.b=max(a,j);u.fa=-;
int id=idx(u.a,u.b);
v[a][id]=v[i][id]=;
end++;
// printf("%d %d %d %d %d\n",u.i,u.r,u.a,u.b,u.fa);
}
continue;
}
node&u=q[end]; //a,b不同时直接入队即可
u.i=i;u.r=i%n;
u.a=min(a,b);u.b=max(a,b);u.fa=-;
int id=idx(u.a,u.b);
v[a][id]=v[i][id]=;
end++;
// printf("%d %d %d %d %d\n",u.i,u.r,u.a,u.b,u.fa);
}
}
void print(int u)
{
if(q[u].fa==-) { printf("%d",q[u].i);return; }
print(q[u].fa);
printf("%d",q[u].i);
}
void bfs2()
{
memset(v,,sizeof(v[])*n);
int front=,end=;
init(end);
while(front<end)
{
node&u=q[end],&f=q[front];
int id=idx(f.a,f.b);
if(f.r==) { print(front);printf("\n");return; }
u.r=((int)f.r*+f.a)%n;
if(!v[u.r][id]) //加一位a
{
v[u.r][id]=; //刚开始错在这,没有标记,也是够傻了。。。而且还一直找不到。。。
u.a=f.a;u.b=f.b;u.fa=front;
u.i=f.a;
end++;
}
node&p=q[end];
p.r=((int)f.r*+f.b)%n;
if(!v[p.r][id]) //加一位b
{
v[p.r][id]==;
p.a=f.a;p.b=f.b;p.fa=front;
p.i=f.b;
end++;
}
front++;
// printf("%d %d\n",front,end);
}
}
int main()
{
//freopen("out","w",stdout);
//freopen("in","r",stdin);
//scanf("%d",&T);
while(scanf("%d",&n)==&&n)
//for(n=65535;n>0;n--)
{
if(bfs1()) continue;
bfs2();
}
//printf("time=%.3lf\n",(double)clock()/CLOCKS_PER_SEC);
return ;
}
hdu1664 bfs+余数判重的更多相关文章
- poj 1465 Multiple(bfs+余数判重)
题意:给出m个数字,要求组合成能够被n整除的最小十进制数. 分析:用到了余数判重,在这里我详细的解释了.其它就没有什么了. #include<cstdio> #include<cma ...
- hdu 1226 bfs+余数判重+大数取余
题目: 超级密码 Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total ...
- hdu 1226 超级密码(bfs+余数判重)
题意:略过 分析:用m个数字组成一个能够被n整除的c进制数的最小值,实际上本题的关键就在于这个最小值上. 首先确定我们的思路是从小到大寻找.先查看一位数,即查看着m个数字是否能被n整除:若不能,就查 ...
- hdu 4444 Walk (离散化+建图+bfs+三维判重 好题)
Walk Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Total Submi ...
- Keyboarding (bfs+预处理+判重优化)
# #10030. 「一本通 1.4 练习 2」Keyboarding [题目描述] 给定一个 $r$ 行 $c$ 列的在电视上的"虚拟键盘",通过「上,下,左,右,选择」共 $5 ...
- Hdu2437-Jerboas(取余数判重搜索)
Jerboas are small desert-living animals, which resemble mice with a long tufted tail and very long h ...
- BFS+Hash(储存,判重) HDOJ 1067 Gap
题目传送门 题意:一个图按照变成指定的图,问最少操作步数 分析:状态转移简单,主要是在图的存储以及判重问题,原来队列里装二维数组内存也可以,判重用神奇的hash技术 #include <bits ...
- 洛谷 P1379 八数码难题 Label:判重&&bfs
特别声明:紫书上抄来的代码,详见P198 题目描述 在3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字.棋盘中留有一个空格,空格用0来表示.空格周围的棋子可以移到空格中.要求解的问题是:给 ...
- UVA 10651 Pebble Solitaire(bfs + 哈希判重(记忆化搜索?))
Problem A Pebble Solitaire Input: standard input Output: standard output Time Limit: 1 second Pebble ...
随机推荐
- Hibernate缓存配置
一级缓存 Hibernate的一级缓存是由Session提供的,因此它只存在于Session的生命周期中,当程序调用save(),update(),saveorupdate()等方法 及调用查询接口l ...
- [oc] instancetype vs id for Objective-C 【转】
原贴地址:http://blog.csdn.net/lyy_whg/article/details/12846055 http://www.iwangke.me/2013/01/06/instance ...
- 浅谈Web前端浏览器兼容问题
对于兼容最近一直困扰我,以前写的代码只是针对高质量用户来使用 不考虑IE7,8 这样的浏览器 ,但是最近我开发的时候必须要兼容,大喊一声我曹,没有办法,自己来吧! 所谓的浏览器兼容性问题,是指因为不同 ...
- Python 函数简介 之二
1.当函数有多个返回值时, 其多个返回值将以元组的形式出现 def test1(): print("in the test1") return 'end' def test2(): ...
- quagga源码分析--大内总管zebra
zebra,中文翻译是斑马,于是我打开了宋冬野的<斑马,斑马>作为BGM来完成这个篇章,嘿嘿,小资一把! zebra姑且戏称它是quagga项目的大内总管. 因为它负责管理其他所有协议进程 ...
- [z] .net与java建立WebService再互相调用
http://blog.csdn.net/yenange/article/details/5824967 : .net建立WebService,在Java中调用. 1.在vs中新建web 简单修改一下 ...
- 为知笔记markdown插件安装
Wiz.Editor.md 是一个基于 Editor.md 构建的为知笔记 Markdown 插件. 主要特性 多种样式主题 支持实时预览 支持代码高亮 支持搜索替换 支持ToC目录 Tex数学公式 ...
- codevs1028花店橱窗布置(费用流)
这几天刚学了费用流,找到了这道题来练一练手. 题目: 题目描述 Description 假设以最美观的方式布置花店的橱窗,有F束花,V个花瓶,我们用美学值(一个整数)表示每束花放入每个花瓶所产生的美学 ...
- IOS GCD图片数据异步下载,下载完成后合成显示
关于GCD使用详解,请看我的上一篇blog:http://www.cnblogs.com/xin-lang/p/6278606.html 前段时间遇到个需要异步下载,下载完成后再组合显示的东西.这里我 ...
- typings 命令使用注意
1.如果要查询一些库 typings search xxx 2.安装jquery node 这样的库要这样 typings dt~node --global --save 一定要dt~xxx ,然 ...