Find The Multiple
Time Limit: 1000MS | Memory Limit: 10000K | |||
Total Submissions: 26926 | Accepted: 11174 | 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
题意:找到一个由01组成的串m使得 m%n == 0
题解:同余定理.很强的搜索剪枝技巧。
同余剪枝,如果一个小数的余数和大数的余数相同,假设小点的数 a ,大点的为 b ,a%n==b%n => (a+c)%n == (b+c)%n ,我们假设 a+c是符合条件的,那么,b+c 也是符合条件的,所以我们可以直接不要
b+c 了,这就是一个很巧妙并且很强的剪枝.
#include <cstdio> #include <cstring> #include <queue> #include <algorithm> #include <stdlib.h> #include <string> #include <iostream> using namespace std; int n; bool mod[210]; ///这里是最强的剪枝,同余剪枝,如果一个小数的余数和大数的余数相同 ///假设小点的数 a ,大点的为 b ,a%n==b%n => (a+c)%n == (b+c)%n ,我们假设 a+c是符合条件的,那么 /// b+c 也是符合条件的,所以我们可以直接不要 b+c 了,这就是一个很巧妙并且很强的剪枝. struct Node{ int mod; string ans; }; string bfs(){ memset(mod,false,sizeof(mod)); queue<Node> q; Node s; s.ans = "1"; s.mod = 1%n; q.push(s); while(!q.empty()){ Node now = q.front(); q.pop(); if(now.mod==0){ return now.ans; } Node next; next.mod = (now.mod*10+1)%n; next.ans = now.ans+"1"; if(!mod[next.mod]){ mod[next.mod] = true; q.push(next); } next.mod = (now.mod*10)%n; next.ans = now.ans+"0"; if(!mod[next.mod]){ mod[next.mod] = true; q.push(next); } } } int main(){ while(scanf("%d",&n)!=EOF,n){ cout<<bfs()<<endl; } }