Description
用全部N(N<=10)个0-9的数字组成一个“有效”整数(即没有前置0的整数), 求这些组成的数中能被K(0<K<10^10)整除的最小数字。
输入格式
输入分两行,第一行输入N, K,第二行输入N个数字。
输出格式
输出满足条件的最小的数(不含前置0),如果没有满足条件的数输出 -1。
输入样例
4 7 4 0 1 3
输出样例
1043
提示
413 % 7 = 0, 但是有前置0,所以满足条件的最小数是 1043 % 7 = 0。 此类题目需注意特殊情况,比如n=1时,如只输入一个0,答案只能是0。 注意long long
分析:
全排列问题,将N个数字先从小到大排个序,再进行全排列,然后注意没有前置0这个小细节就行
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
typedef long long ll;
bool v[15];
ll n,a[15],b[15],k,flag;
ll add() {
ll sum=0;
for(int i=1; i<=n; ++i) {
sum=sum*10+b[i];
}
return sum;
}
void dfs(int u) {
if(u==n+1) {
ll sum=add();
//cout<<sum<<endl;
if((n==1||b[1])&&sum%k==0&&!flag) {
for(int i=1; i<=n; ++i) {
cout<<b[i];
}
flag=1;
}
return;
} else {
for(int i=1; i<=n; ++i) {
if(!v[i]) {
v[i]=true;
b[u]=a[i];
//cout<<b[u]<<endl;
dfs(u+1);
v[i]=false;
}
}
}
}
int main() {
cin>>n>>k;
for(int i=1; i<=n; ++i) {
cin>>a[i];
}
sort(a+1,a+1+n);
dfs(1);
if(!flag){
cout<<"-1";
}
return 0;
}