• HDU 4294 Multiple


    Multiple

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
    Total Submission(s): 1071    Accepted Submission(s): 273


    Problem Description
      Given a positive integer N, you’re to solve the following problem:
      Find a positive multiple of N, says M, that contains minimal number of different digits in base-K notation. If there’re several solutions, you should output the numerical smallest one. By saying numerical smallest one, we compar their numerical value, so 0xAhex < 11dec.
      You may assume that 1 <= N <= 104 and 2 <= K <= 10.
     
    Input
    There’re several (less than 50) test cases, one case per line.
    For each test case, there is a line with two integers separated by a single space, N and K.
    Please process until EOF (End Of File).
     
    Output
    For each test case, you should print a single integer one line, representing M in base-K notation,the answer.
     
    Sample Input
    10 8
    2 3
    7 5
     
    Sample Output
    2222
    2
    111111
     
    Source
     
    解题:据说:

    最多用两个数就可以表示任何数的倍数。

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

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

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

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

    然后暴力搜索即可

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 const int maxn = 20010;
     4 string ans,str;
     5 int n,k,m,num[2],pre[maxn],b[maxn];
     6 bool bfs() {
     7     queue<int>q;
     8     memset(b,-1,sizeof b);
     9     for(int i = 0; i < m; ++i) 
    10         if(num[i]) {
    11             q.push(num[i]);
    12             b[num[i]] = num[i];
    13         }
    14     memset(pre,-1,sizeof pre);
    15     while(!q.empty()) {
    16         int u = q.front();
    17         q.pop();
    18         if(!u) return true;
    19         for(int i = 0; i < m; ++i) {
    20             int t = (u*k + num[i])%n;
    21             if(b[t] == -1) {
    22                 b[t] = num[i];
    23                 pre[t] = u;
    24                 q.push(t);
    25             }
    26             if(!t) return true;
    27         }
    28     }
    29     return false;
    30 }
    31 void Path(int u) {
    32     if(pre[u] != -1) Path(pre[u]);
    33     str += (char)(b[u] + '0');
    34 }
    35 bool cmp(string &a,string &b) {
    36     if(b.size() == 0) return true;
    37     if(a.size() > b.size()) return false;
    38     if(a.size() < b.size()) return true;
    39     return a < b;
    40 }
    41 int main() {
    42     while(~scanf("%d%d",&n,&k)) {
    43         if(n < k) {
    44             printf("%d
    ",n);
    45             continue;
    46         }
    47         bool  flag = false;
    48         ans = "";
    49         for(int i = m = 1; i < k; ++i) {
    50             num[0] = i;
    51             if(bfs()) {
    52                 str = "";
    53                 Path(0);
    54                 flag = true;
    55                 if(cmp(str,ans)) ans = str;
    56             }
    57         }
    58         if(!flag) {
    59             m = 2;
    60             for(int i = 1; i < k; ++i) {
    61                 num[1] = i;
    62                 for(int j = 0; j < i; ++j) {
    63                     num[0] = j;
    64                     if(bfs()) {
    65                         str = "";
    66                         Path(0);
    67                         if(cmp(str,ans)) ans = str;
    68                     }
    69                 }
    70             }
    71         }
    72         cout<<ans<<endl;
    73     }
    74     return 0;
    75 }
    View Code
  • 相关阅读:
    利用ajax.dll类库文件实现无刷新
    给input的按钮控件添加onserverclick事件
    wpf datagrid 如何让标头 及内容居中
    MVC中Url请求与控制器的默认约定
    ASP.NET MVC中实现多个按钮提交的几种方法
    default(T)的含义
    MVC中Html.Listbox的用法实例
    编写高质量代码改善C#程序的157个建议——建议101:使用扩展方法,向现有类型“添加”方法
    编写高质量代码改善C#程序的157个建议——建议100:静态方法和实例方法没有区别
    编写高质量代码改善C#程序的157个建议——建议99:重写时不应使用子类参数
  • 原文地址:https://www.cnblogs.com/crackpotisback/p/4777247.html
Copyright © 2020-2023  润新知