zoukankan      html  css  js  c++  java
  • poj 1426(同余搜索)

    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;
        }
    }
  • 相关阅读:
    人才培养的金字塔模型
    3D建模技术-讲稿-5-基础
    3D建模技术-讲稿-4-基础
    3D建模技术-讲稿-3-基础
    3D建模技术-讲稿-1-入门
    3D建模技术-讲稿-2-基础
    3D建模技术-讲稿-1-方凳
    the latest Ext2Fsd(ext2fsd-0.69) doesn't work after windows 10 --- solved using ext2fsd-0.53 or 0.68
    欢迎同学们参加新乡学院2019年3D打印暑期夏令营
    (OK) 自己动手构建Linux发行版---简版
  • 原文地址:https://www.cnblogs.com/liyinggang/p/5743619.html
Copyright © 2011-2022 走看看