2 条题解
-
0端木俁 (房佳坤) LV 10 @ 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; }
-
02022-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
- 上传者