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 ...
随机推荐
- 回收站引发ORACLE查询表空间使用缓慢
一个哥们问我 ,他们查询 表空间使用率 跑了一个多小时,这个太坑爹了,让我 帮忙优化一下. SQL语句如下 select * from ( select ts.tablespace_name,ts.c ...
- [C++]neuroscan的延时预估
一直用自己写的程序在线处理脑电信号,知道其中有一个时间延时,但具体延时是多少没有是个准确的估计,今天抽时间做了一下,发现大概延时在100ms左右. 以后尝试使用并口操作.应该可以完全避免这个问题. 实 ...
- [置顶] ROS探索总结(十一)——机器视觉
机器视觉在计算机时代已经越来越流行,摄像头价格越来越低廉,部分集成深度传感器的混合型传感器也逐渐在研究领域普及,例如微软推出的Kinect,而且与之配套的软件功能十分强大,为开发带来了极大的便利.RO ...
- Spring MVC---数据绑定和表单标签
数据绑定和表单标签 数据绑定 数据绑定是将用户输入绑定到领域模型的一种特性,在Spring MVC的controller和view数据传递 ...
- ELK采集之nginx 之高德地图出城市IP分布图
1.采用拓扑: 角色扮演: Agent:采用logstash,IP:192.168.10.7 Redis队列: IP:192.168.10.100 Indexer:logstash,IP:192.16 ...
- go CD 用虚拟机快速增加一个新agent
背景 最近项目在用go CD做持续交付.为了最大化利用硬件,所有的agent都是用的vbox的虚拟机.随着pipelines的增加,就需要增加更多的agent. 步骤 为了快速增加新的agent,最简 ...
- Linux之初体验
预备作业03--我的Linux初体验 学习基于VirtualBox虚拟机安装Ubuntu图文教程在自己笔记本上安装Linux操作系统 一开始以为这个项目很简单,以往也在自己的笔记本上看教程安装过软件, ...
- Python map多线程
import os import PIL from multiprocessing import Pool from PIL import Image SIZE = (75,75) SAVE_DIRE ...
- JVM性能调优监控工具jps、jstack、jmap、jhat、jstat使用详解
Jmap是一个可以输出所有内存中对象的工具,甚至可以将VM 中的heap,以二进制输出成文本.打印出某个java进程(使用pid)内存内的,所有'对象'的情况(如:产生那些对象,及其数量). 使用方法 ...
- linux操作系统简单使用
文章将包含几个内容: linux简介 linux操作系统的安装简述 linux操作系统的磁盘文件结构 linux操作系统中的文件操作 linux中的用户管理 网络配置管理 常用系统管理指令 linux ...