POJ 1426 Find The Multiple && 51nod 1109 01组成的N的倍数 (BFS + 同余模定理)
Posted wzzkaifa
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了POJ 1426 Find The Multiple && 51nod 1109 01组成的N的倍数 (BFS + 同余模定理)相关的知识,希望对你有一定的参考价值。
Find The Multiple
Time Limit: 1000MS | Memory Limit: 10000K | |||
Total Submissions: 21436 | Accepted: 8775 | Special Judge |
Description
Given a positive integer n, write a program to find out a nonzero multiple m of n whose decimal representation contains only the digits 0 and 1. You may assume that n is not greater than 200 and there is a corresponding m containing no more than 100 decimal
digits.
Input
The input file may contain multiple test cases. Each line contains a value of n (1 <= n <= 200). A line containing a zero terminates the input.
Output
For each value of n in the input print a line containing the corresponding value of m. The decimal representation of m must not contain more than 100 digits. If there are multiple solutions for a given value of n, any one of them is acceptable.
Sample Input
2 6 19 0
Sample Output
10 100100100100100100 111111111111111111
Source
题意:输入一个正整数n(1<=n<=200),然后要求找一个仅仅包括0和1的十进制数字能整除n
#include<iostream> #include<algorithm> #include<stdio.h> #include<string.h> #include<stdlib.h> #include<queue> using namespace std; int n; int ans; int v[5000]; struct node { int x; int y; } a[1000010]; void DFS(int k) { int pt = a[k].y; if(pt <= 0) { printf("1"); return ; } DFS(pt); printf("%d",a[pt].x); } void BFS() { ans = 1; memset(v,0,sizeof(v)); queue<node>q; struct node t,f; t.x = 1; t.y = 0; a[0].x = 1; a[0].y = 0; q.push(t); while(!q.empty()) { t = q.front(); q.pop(); for(int i=0; i<=1; i++) { f.x = t.x * 10 + i; /// 同余模定理应用 if(v[f.x] == 0) { f.x = f.x % n; f.y = ans; q.push(f); v[f.x] = 1; a[ans].x = i; a[ans].y = t.y; if(f.x == 0) { DFS(ans); printf("%d\n",i); return ; } ans++; } } } } int main() { while(scanf("%d",&n)!=EOF) { if(n == 0) { break; } BFS(); } return 0; }
51nod 1109
#include<iostream> #include<algorithm> #include<stdio.h> #include<string.h> #include<stdlib.h> #include<queue> using namespace std; int n; int ans; int v[1010000]; struct node { int x; int y; } a[1000010]; void DFS(int k) { int pt = a[k].y; if(pt <= 0) { printf("1"); return ; } DFS(pt); printf("%d",a[pt].x); } void BFS() { ans = 1; memset(v,0,sizeof(v)); queue<node>q; while(!q.empty()){ q.pop(); } struct node t,f; t.x = 1; t.y = 0; a[0].x = 1; a[0].y = 0; q.push(t); while(!q.empty()) { t = q.front(); q.pop(); for(int i=0; i<=1; i++) { f.x = t.x * 10 + i; /// 同余模定理应用 f.x = f.x % n; if(v[f.x] == 0) { f.y = ans; q.push(f); v[f.x] = 1; a[ans].x = i; a[ans].y = t.y; if(f.x == 0) { DFS(ans); printf("%d\n",i); return ; } ans++; } } } } int main() { while(scanf("%d",&n)!=EOF) { BFS(); } return 0; }
以上是关于POJ 1426 Find The Multiple && 51nod 1109 01组成的N的倍数 (BFS + 同余模定理)的主要内容,如果未能解决你的问题,请参考以下文章
广搜+打表 POJ 1426 Find The Multiple
POJ 1426 - Find The Multiple - [DP][BFS]