牛客小白月賽41 小紅的375
阿新 • • 發佈:2021-12-07
直接判斷一個數是不是375的倍數很難,但是判斷一個數是不是3000(注意3000=375 \(\times\) 8)的倍數卻很簡單
我們能想到任何一個是375的倍數的數都能表示成n \(\times\) 3000+m \(\times\) 375(m<=7)的形式
然後直接列舉m就好了。
#include<iostream> #include<cstring> #include<string> using namespace std; int len; int tong[13]; char s[300010]; int pan(int a,int b,int c,int d) { tong[b]--;tong[c]--;tong[d]--; for(int i=0;i<=9;++i) if(tong[i]<0) { tong[b]++;tong[c]++;tong[d]++; return 0; } int now=0,ok=0; for(int i=1;i<=9;++i) { now+=tong[i]*i; if(tong[i])ok=1; } if((ok||tong[0]==0)&&now>=a&&now%3==a) { for(int i=9;i>=0;--i) for(int j=1;j<=tong[i];++j)printf("%d",i); printf("%d%d%d",b,c,d); return 1; } else { tong[b]++;tong[c]++;tong[d]++; return 0; } } int main() { scanf("%s",s+1);len=strlen(s+1); for(int i=1;i<=len;++i)++tong[s[i]-'0']; if(pan(0,0,0,0))return 0; if(pan(0,3,7,5))return 0; if(pan(0,7,5,0))return 0; if(pan(1,1,2,5))return 0; if(pan(1,5,0,0))return 0; if(pan(1,8,7,5))return 0; if(pan(2,2,5,0))return 0; if(pan(2,6,2,5))return 0; cout<<"-1"; return 0; }