2 条题解

  • 0
    @ 2022-04-04 21:07:46
    #include <vector>
    #include <iostream>
    #include <algorithm>
    #include <functional>
    
    using namespace std;
    
    int n, k;
    int res(2e9);
    int st[10];
    
    int main()
    {
        scanf("%d%d", &n, &k);
        int cnt(0);
        // 将n分解,得到n的每一位出现的次数
        while (n)
        {
            st[n % 10] ++ ;
            n /= 10;
            cnt ++ ;
        }
        
        function<void(int, int)> dfs = [&](int x, int cnt) -> void {
            if (!cnt) 
            {
                if (x % k == 0) res = min(res, x);
                return ;
            }
            for (int i = 0; i < 10; i ++ )
            {
                if (!x && i == 0 && st[i]) continue; // 前导零
                if (st[i])
                {
                    int nn = x; // 将x先记下来,之后回溯
                    x = x * 10 + i; // 加上新的一位
                    st[i] -- ;
                    cnt -- ;
                    dfs(x, cnt);
                    cnt ++ ;
                    st[i] ++ ;
                    x = nn;
                }
            }
        };
        dfs(0, cnt);
        
        if (res == 2e9) res = -1;
        
        printf("%d", res);
        
        return 0;
    }
    
  • 0
    @ 2022-04-02 16:23:53

    考虑数字\(x\)的全排列,这可以通过dfs或者next_permutation()枚举。随后检验。

    时间复杂度是\(\mathcal{O(\log(x)!)}\)

    #include<bits/stdc++.h>
    using namespace std;
    int main()
    {
        string s;
        int k; cin>>s>>k;
        sort(s.begin(), s.end());
        do{
            long long x = 0;
            if(s[0] == '0') continue;
            for(auto it: s) x = x * 10 + it-'0';
            if(x%k==0){
                cout<<x<<'\n';
                return 0;
            }
        }while(next_permutation(s.begin(), s.end()));
        cout<<-1;
        return 0;
    }
    
  • 1

信息

ID
1343
难度
6
分类
(无)
标签
(无)
递交数
59
已通过
17
通过率
29%
被复制
2
上传者