萌新刚学 $OI 10^{-10000}$ 秒,测试点8总是WA
查看原帖
萌新刚学 $OI 10^{-10000}$ 秒,测试点8总是WA
308854
tzl_Dedicatus545楼主2021/4/4 20:33

RTRT ,

code:

//By Luogu@wangdemao(308854)
#include <iostream>
#include <cstring>

using namespace std;

int GetPrimeFactor2InANum(unsigned long long num);
int GetPrimeFactor5InANum(unsigned long long num);

int PrimeFactor2[220],PrimeFactor5[220];
unsigned long long dp[220][6221];
unsigned long long Numbers[220];
int n,k;

int main()
{
	cin>>n>>k;
	
	for(int i=1;i<=n;i++)
	{
		cin>>Numbers[i];

		PrimeFactor2[i]=GetPrimeFactor2InANum(Numbers[i]);

		PrimeFactor5[i]=GetPrimeFactor5InANum(Numbers[i]);
	}
	
	memset(dp,-1,sizeof(dp));
	
	for(int i=0;i<200;i++)
		dp[i][0]=dp[0][i]=0;
	
	for(int i=1;i<=n;i++)
	{
		for(int j=k;j>=1;j--)
		{
			for(int l=6200;l>=PrimeFactor5[i];l--)
			{
				if(Numbers[i]!=0)
					dp[j][l]=max(dp[j][l],dp[j-1][l-PrimeFactor5[i]]+PrimeFactor2[i]);
			}
		}
	}
	
	unsigned long long ans=0;
	
	for(unsigned long long i=0;i<=6200;i++)
		ans=max(ans,min(i,dp[k][i]));
		
	cout<<ans;
	
	return 0;
}

int GetPrimeFactor2InANum(unsigned long long num)
{
	int cnt=0;
	
	if(num==0)
		return 0;
	
	while(num%2==0)
		num/=2,cnt++;
		
	return cnt;	
}

int GetPrimeFactor5InANum(unsigned long long num)
{
	int cnt=0;
  
	if(num==0)
		return 0;

	while(num%5==0)  
		num/=5,cnt++;
		
	return cnt;	
}
2021/4/4 20:33
加载中...