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 ...
随机推荐
- FormData可实现异步传输二进制文件(即异步文件上传)
XMLHttpRequest Level 2 添加了一个新的接口——FormData.它能使现在的AJAX交互更加简单.之前的AJAX在上传前,需要将表单的数据序列化.与普通的 Ajax 相比,使用 ...
- poj-3898 Software Industry Revolution DP
题目链接: http://poj.org/problem?id=3898 题目意思: 有两个字符串,模式串和原串.每个字母有一个权值,a为1,b为2,...z为26 模式串中‘ ?’可以被一个字母代替 ...
- continue与break
1.continue语句,1至20内奇数累加和 #include<iostream> using namespace std; void main(){ int i=0; int sum= ...
- ok6410 u-boot-2012.04.01移植二修改源码支持单板
继ok6410 u-boot-2012.04.01移植一后修改代码,对ok6410单板初始化,主要包括时钟.串口.NAND.DDR等初始化.这些工作在以前的裸板程序都写了,直接拿来用.我觉得先写裸板程 ...
- C#的FTP上传下载的实验
前段时间做了一个FTP操作服务器文件的实验,现在把一些经验写下来,免得忘记. 1.上传的处理:目标文件夹A上传到服务器指定目录.先检索服务器目录中有无同名文件夹,若有,则先改名,上传成功后再删除,上传 ...
- webpack中加载CSS
webpack强大之处在于可以将CSS当做一个资源模块进行管理和加载 基本使用: 安装webpack的加载插件style-loader和css-loader: npm install style-lo ...
- Js-Html 前端系列--点击非Div区域隐藏Div
最近做项目要用到三字码下拉,调用一个插件,但是滚动条不能点击. 后来看另一个插件后突发奇想,在点击其他区域的时候隐藏这个Div就可以了. 背景:输入文字,弹出下拉Div,点击或者拉动Div滚动条选择, ...
- WIN10使用管理员权限运行VS2013
学习WCF时出现报错-- 其他信息: HTTP 无法注册 URL http://+:8083/User/.进程不具有此命名空间的访问权限(有关详细信息,请参见 http://go.microsoft. ...
- java的return区别
return ;和return null的区别在于:前者当方法返回值为void时候,return ; 跳出方法. 后者当方法的返回值为object对象时,return null,跳出方法,返回值为空值 ...
- 妙味H5交互篇备忘
document.addEventListener( 'touchstart', function(e){ e.preventDefault(); } ); 在document上增加touchst ...