首先对于3,我们知道一个很显然的结论:每位数字和相加能被3整除那整个数也能被3整除,对于125,我们发现只要末尾是125的倍数就行,所以它实际上是8个数为循环。 所以我们只需要定义一个来表示8种情况,然后每次枚举当前第i种情况是否合法,如果合法就直接输出即可,当然我们枚举的时候因为不能有前导0所以我们需要把8个数中有0的先枚举;其次对于输出全是0的情况我们应该先判掉输出-1。
//#pragma GCC optimize(2)
//#pragma GCC optimize(3,"Ofast","inline")
# include<iostream>
# include<iomanip>
# include<algorithm>
# include<cmath>
# include<cstdio>
# include<set>
# include<stack>
# include<queue>
# include<map>
# include<string>
# include<cstring>
//# include<unordered_map>
# define eps 1e-9
# define fi first
# define se second
# define ll long long
# define int ll
// cout<<fixed<<setprecision(n)
using namespace std;
typedef unsigned long long ull;
typedef pair<int,int > PII;
const int mod=998244353;
const int MAX=3e5+10;
const int Time=86400;
const int X=131;
const int inf=0x3f3f3f3f;
const double PI = 1e-4;
double pai = 3.14159265358979323846;
int T,n,m,H,res;
string s[8]={"000","250","500","750","125","375","625","875"};
int sum[10];
void solve(){
int cnt = 0;
string st;
cin >> st;
n = st.size();
for(int i = 0 ; i < n ; i ++ ){
sum[st[i]-'0']++;
res+=st[i]-'0';
if(st[i] == '0') cnt++;
}
if(res % 3 != 0 || cnt == n){ //不能被3整除 或者 全为0
cout<<"-1";
return ;
}
for(int i = 0; i<8; i++){ //枚举8种情况
for(int j = 0; j<3; j++){ //对于第i种情况默认可以构造,那就把他构造到末尾
sum[s[i][j] - '0']--; //所以要先减3个
}
bool flag = 1;
for(int j = 0; j<=9; j++){ //判断这种构造方法是否合理
if(sum[j]<0){
flag = 0;
break;
}
}
if(flag){ //合理就从大到小输出
for(int j=9;j>=0;j--)while(sum[j])cout<<j,sum[j]--;
cout<<s[i];
return ;
}//不合理就把原来减的值加回去
for(int j = 0; j<3; j++){
sum[s[i][j] - '0']++;
}
}
cout<<"-1";//8种情况都不行就输出-1
}
signed main(){
std::ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
//cin >> T;
T = 1;
while(T--){
solve();
}
return 0;
}