牛客练习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;
}

  

 

posted @ 2018-12-14 14:40  Nanamiii  阅读(150)  评论(0)    收藏  举报