1. 程式人生 > 其它 >牛客小白月賽41 小紅的375

牛客小白月賽41 小紅的375

題目連結

直接判斷一個數是不是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;
}