题意:给出整数n,将n的数位重新排列,使得排列后的数字被8整除,并且尽量的大,不包含前导0. n<=10^100.
因为1000≡0(mod 8) 所以一个数x末3位被8整除,则x被8整除.
n<=10^100 字符串读入,并且存储每个数位的个数.
枚举最后3位数, 判断n是否有这三个数位后, 将剩下的数位从大到小存到字符串,然后直接比较即可.
#includeusing namespace std;typedef long long ll;typedef pair 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 >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< <<'\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 =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< <<'\n'; else cout<<-1<<'\n'; } return 0;}