zoukankan      html  css  js  c++  java
  • hdu 4294 Multiple

    思路:

    首先给出一个结论,就是最多用两个数就可以表示任何数的倍数。

    证明 :对于一个数字a,可以构造出的数字有

    a,aa,aaa,aaaa,aaaaa,……

    每一个数对于n都有一个余数,余数最多有n个,根据鸽巢原理,前n+1个数中,必然有两个余数相等

    那么二者之差,必定为n的倍数,形式为a……a0……0。

    有这个结论,就简单了

    先枚举一个数,然后枚举两个数,BFS即可

    代码如下:

     1 #include<iostream>
     2 #include<stdio.h>
     3 #include<algorithm>
     4 #include<iomanip>
     5 #include<cmath>
     6 #include<cstring>
     7 #include<vector>
     8 #include<queue>
     9 #define MAX 10001
    10 using namespace std;
    11 string ans,str;
    12 int n,k,m,num[MAX],vis[MAX],next[MAX];
    13 bool bfs()
    14 {
    15     queue<int>p;
    16     memset(vis,-1,sizeof(vis));
    17     for(int i=0;i<m;i++)
    18     if(num[i]){
    19         p.push(num[i]);
    20         vis[num[i]]=num[i];
    21         next[num[i]]=-1;
    22     }
    23     while(!p.empty()){
    24         int e=p.front();
    25         p.pop();
    26         if(!e) return true;
    27         for(int i=0;i<m;i++){
    28             int t=(e*k+num[i])%n;
    29             if(vis[t]==-1){
    30                 vis[t]=num[i];
    31                 next[t]=e;
    32                 p.push(t);
    33             }
    34         }
    35     }
    36     return false;
    37 }
    38 bool cmp(string a,string b)
    39 {
    40     if(b.size()==0) return true;
    41     if(a.size()>b.size()) return false;
    42     if(a.size()<b.size()) return true;
    43     return a<b;
    44 }
    45 void solve(int k)
    46 {
    47     if(next[k]!=-1) solve(next[k]);
    48     str+=(char)(vis[k]+'0');
    49 }
    50 int main(){
    51     while(cin>>n>>k){
    52         if(n<k){
    53             cout<<n<<endl;
    54             continue;
    55         }
    56         bool flag=0;ans="";
    57         for(int i=1;i<k;i++){
    58             num[0]=i;
    59             m=1;
    60             if(bfs()){
    61                 str="";
    62                 solve(0);
    63                 flag=true;
    64                 if(cmp(str,ans))
    65                     ans=str;
    66             }
    67         }
    68         if(!flag){
    69             for(int i=1;i<k;i++)
    70             for(int j=0;j<i;j++){
    71                 num[0]=j;num[1]=i;
    72                 m=2;
    73                 if(bfs()){
    74                     str="";
    75                     solve(0);
    76                     if(cmp(str,ans))
    77                         ans=str;
    78                 }
    79             }
    80         }
    81         cout<<ans<<endl;
    82     }
    83     return 0;
    84 }
    View Code
  • 相关阅读:
    linux网络配置
    第二章 以太网和数据封装
    linux用户权限
    第一章 网络互联
    linux学习之文件系统
    史上最全Java学习视频下载地址分享
    JAVA高级特性之集合
    Map集合不继承Collection接口,(HashMap类和TreeMap类)---输出结果,如果将Key值修改为首位不为0,HashMap输出就是随机顺序的,求指导,为什么为会这样???
    java中this关键字
    Java long数据类型---网上学习到的资料
  • 原文地址:https://www.cnblogs.com/xin-hua/p/3260968.html
Copyright © 2011-2022 走看看