POJ-1465(同余+高精度)

来源:互联网 发布:免费提词器软件 编辑:程序博客网 时间:2024/05/19 21:42

其实很简单的思想,外加贴一个模版

【题目描述】给一个数N 然后给M个一位数 问你是否有N的倍数 完全由这些一位数组成

先说算法 用BFS不停的扩展 就是X10这样的扩展 然后如果对N取余的余数没有出现过就把这个扩展得数的余数添加到队列里 如果余数是0的话就可以输出了 
当然 扩展的时候要考虑到0,这些都不是最关键的 最关键的是这个数可能非常大 long long 不够 而高精的话比较麻烦。用链表。
还有一点 这个队列最多只有5000就够了。
另外 不需要证明所有的余数都取到了 没有必要 

/******************************************************************************************************

 ** Copyright (C) 2011.07.01-2013.07.01 ** Author: famousDT <13730828587@163.com> ** Edit date: 2012-03-11******************************************************************************************************/#include <stdio.h>#include <stdlib.h>//abs,atof(string to float),atoi,atol,atoll#include <math.h>//atan,acos,asin,atan2(a,b)(a/b atan),ceil,floor,cos,exp(x)(e^x),fabs,log(for E),log10#include <vector>#include <queue>#include <deque>//two direction queue#include <map>#include <time.h>#include <set>#include <list>#include <stack> #include <string>#include <iostream>#include <fstream>#include <assert.h>#include <bitset>#include <iterator>//C++Primer#include <string.h>//memcpy(to,from,count#include <ctype.h>//character process:isalpha,isdigit,islower,tolower,isblank,iscntrl,isprll#include <numeric>#include <utility>//pair#include <functional>#include <algorithm>using namespace std;typedef long long int ll;#define MY_E exp(1.0)#define MY_PI acos(-1.0)#define MY_MAX(a, b) ((a) > (b) ? (a) : (b))#define MY_MIN(a, b) ((a) < (b) ? (a) : (b))#define MY_MALLOC(n, type) ((type *)malloc((n) * sizeof(type)))#define MY_ABS(a) (((a) >= 0) ? (a) : (-(a)))#define MY_INT_MAX 0x7fffffff#define CLEAR(a) memset(a, 0, sizeof(a))/*==========================================================*\| \*==========================================================*/ #define N 5000 + 5struct node{int res; //余数int digit; //位数node *pre;} q[N];bool hash[N];void output(node x){if (x.pre) {output(*x.pre);printf("%d", x.digit);}}void bfs(int n, int m, int d[]){int i, j;CLEAR(hash);int front = 0, rear = 1;q[0].pre = NULL;q[0].digit = q[0].res = 0;node * first = &q[0];while (front < rear) {node now, curr = q[front];now.pre = &q[front];for (i = 0; i < m; ++i) {int res = (curr.res * 10 + d[i]) % n;if (hash[res] == 0 && (now.pre != first || d[i] > 0)) {hash[res] = true;now.res = res;now.digit = d[i];q[rear++] = now;if (now.res == 0) {output(now);printf("\n");return;}}}++front;}printf("0\n");}int main(){int m, n;int d[15];int i;while (scanf("%d%d", &n, &m) == 2) {for (i = 0; i < m; ++i)scanf("%d", &d[i]);if (!n) {printf("0\n");continue;}sort(d, d + m);bfs(n, m, d);}return 0;}



原创粉丝点击