POJ 1465 Multiple (BFS,同余定理)
来源:互联网 发布:手机淘宝追加评价 编辑:程序博客网 时间:2024/06/10 16:35
http://poj.org/problem?id=1465
Multiple
Time Limit: 1000MS Memory Limit: 32768KTotal Submissions: 6164 Accepted: 1339
Description
a program that, given a natural number N between 0 and 4999 (inclusively), and M distinct decimal digits X1,X2..XM (at least one), finds the smallest strictly positive multiple of N that has no other digits besides X1,X2..XM (if such a multiple exists).
Input
The input has several data sets separated by an empty line, each data set having the following format:
On the first line - the number N
On the second line - the number M
On the following M lines - the digits X1,X2..XM.
On the first line - the number N
On the second line - the number M
On the following M lines - the digits X1,X2..XM.
Output
For each data set, the program should write to standard output on a single line the multiple, if such a multiple exists, and 0 otherwise.
An example of input and output:
An example of input and output:
Sample Input
223701211
Sample Output
1100
Source
Southeastern Europe 2000
题意:
给出一个整数N,和M个0~9的数,求N的一个最小倍数,且该数仅由这M个数构成,不存在则输出0。
分析:
如果存在最终的数,一定可以写成A1*10^(k-1)+A2*10^(k-2)+...+Ak,Ai属于给出的M个数的集合。k有可能很大,64位整数也可能存不下。注意到最后的结果是N的倍数,假设结果是X,则有X%N=0,注意到结果的多项式形式,显然能想到使用同余定理。我们需要从1位扩展到k位(当然要一步步来),可以用BFS,用余数来记录状态(只需要第一个),这样状态不超过N个,一旦余数为0,我们需要的结果就出来了。
#include<cstdio>#include<iostream>#include<cstdlib>#include<algorithm>#include<ctime>#include<cctype>#include<cmath>#include<string>#include<cstring>#include<stack>#include<queue>#include<list>#include<vector>#include<map>#include<set>#define sqr(x) ((x)*(x))#define LL long long#define itn int#define INF 0x3f3f3f3f#define PI 3.1415926535897932384626#define eps 1e-10#define maxm#define maxnusing namespace std;int X[10];int n,m;int q[5555];int st[5555];bool __hash[5555];struct __node{ int x,mod,fir;}node[5555];void write(int x){ int top=-1; for (;~x;x=node[x].fir) st[++top]=node[x].x; while (top>=0) printf("%d",st[top--]); puts("");}void bfs(){ int f=0,r=-1,cnt=0; if (!n) { printf("%d\n",0); return ; } memset(__hash,0,sizeof __hash); for (int i=0;i<m;i++) { if (!X[i]) continue; int mod=X[i]%n; if (!mod) { printf("%d\n",X[i]); return ; } if (__hash[mod]) continue; __hash[mod]=true; node[cnt]=(__node){X[i],mod,-1}; q[++r]=cnt; cnt++; } while (f<=r) { int x=q[f++]; for (int i=0;i<m;i++) { int mod=(node[x].mod*10+X[i])%n; if (__hash[mod]) continue; __hash[mod]=true; node[cnt]=(__node){X[i],mod,x}; q[++r]=cnt; if (!mod) { write(cnt); return ; } cnt++; } } printf("0\n");}int main(){ #ifndef ONLINE_JUDGE freopen("/home/fcbruce/文档/code/t","r",stdin); #endif // ONLINE_JUDGE while (~scanf("%d",&n)) { scanf("%d",&m); for (int i=0;i<m;i++) scanf("%d",X+i); sort(X,X+m); bfs(); } return 0;}
2 0
- POJ 1465 Multiple (BFS,同余定理)
- POJ--1465--Multiple【BFS+同余定理】
- poj 1426 Find The Multiple (bfs+同余定理)
- poj 1426 Find The Multiple ( BFS+同余模定理)
- POJ 1426 Find The Multiple(BFS 同余模定理)
- poj 1426 Find The Multiple bfs+同余模定理
- poj 1426 Find The Multiple(bfs+同余定理)
- POJ 1426 Find The Multiple (BFS + 同余定理)
- POJ 1426 Find The Multiple(BFS+同余模定理)
- POJ 1465 Multiple(BFS+同余剪枝)
- ZOJ 1136&&POJ 1465 Multiple(BFS+同余定理)
- POJ 1465 Multiple(BFS+同余剪枝)
- poj 1426 bfs+同余模定理
- POJ 1426 (BFS + 同余定理)
- poj 1426 bfs+同余定理
- POJ 1426 Find The Multiple(同余模定理优化双入口BFS)
- 【POJ】1426 Find The Multiple(暴力|同余模定理|BFS)
- POJ 1426 Find The Multiple【同余模定理+BFS||二叉树+鸽巢】
- MapReduce源码分析之MapTask分析(二)
- Xms Xmx PermSize MaxPermSize 区别
- mysql root用户登录报ERROR(1045)
- 如何成为优秀的c++程序猿
- c++vector用法
- POJ 1465 Multiple (BFS,同余定理)
- Language Focus
- 关于代码注释的一些问题
- 【ZOJ】2071 Technology Trader 最大权闭合子图
- dll方法调用引发的CrtIsValidHeapPointer错误
- 最小割的一点理解
- OC-类 与 方法 小结
- 努力吧
- 字符串长度