牛客练习33 C Tokitsukaze And Number 【同余,暴力】
题意:给出整数n,将n的数位重新排列,使得排列后的数字被8整除,并且尽量的大,不包含前导0. n<=10^100.
因为1000≡0(mod 8) 所以一个数x末3位被8整除,则x被8整除.
n<=10^100 字符串读入,并且存储每个数位的个数.
枚举最后3位数, 判断n是否有这三个数位后, 将剩下的数位从大到小存到字符串,然后直接比较即可.
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> ii;
const int N=2e5+5;
string str,res;
int T,b[11],c[5],flag;
void fun(int x){
string a;
for(int i=1;i<=3;i++){
b[c[i]]--;
if(b[c[i]]<0){
for(int j=1;j<=i;j++) b[c[j]]++;
return;
}
}
for(int i=9;i>=0;i--)
for(int j=1;j<=b[i];j++)
a+=i+'0';
for(int i=3;i>=1;i--) a+=c[i]+'0';
for(int i=1;i<=3;i++) b[c[i]]++;
if(a[0]=='0') return;
if(res<a) res=a,flag=true;
}
void check(int x){
int len=0;
while(x){
c[++len]=x%10;
x/=10;
}
while(len<3) c[++len]=0;
fun(x);
}
int main(){
ios::sync_with_stdio(false);cin.tie(0);
cin>>T;
while(T--){
memset(b,0,sizeof(b));
res="";
flag=0;
cin>>str;
int len=str.length();
if(len==1) {
if(str[0]=='8'||str[0]=='0') cout<<str<<'\n';
else cout<<-1<<'\n';
continue;
}
if(len==2){
int s1=str[0]-'0' + (str[1]-'0')*10;
int s2=(str[0]-'0')*10 +str[1]-'0';
int s=-1;
if(s1%8==0) s=s1;
if(s2%8==0&&s<s2) s=s2;
cout<<s<<'\n';
continue;
}
if(len>=3){
for(int i=0;str[i];i++) b[str[i]-'0']++;
for(int i=0;i<1000;i++){
int x=i;
if(x%8) continue;
check(x);
}
}
if(flag) cout<<res<<'\n';
else cout<<-1<<'\n';
}
return 0;
}

浙公网安备 33010602011771号