题意:
解法:
末尾0的个数=min(质因子2的个数,质因子5的个数).
5^(26)>1e18,因此每个数最多包含26个5,
26*200=5200,因此5的总数量不会超过5200个
令d[i][j][k]表示前i个数,已经选了j个,当前有k个5,能获得的2的最大数量.
dp一下即可.
最后枚举i,用min(d[n][k][i],i)更新答案即可.
code:
#include<bits/stdc++.h>
#define int long long
#define PI pair<int,int>
using namespace std;
const int maxm=1e5+5;
int d[2][205][5205];
PI e[maxm];
int n,k;
void solve(){
cin>>n>>k;
int sum=0;
for(int i=1;i<=n;i++){
int x;cin>>x;
while(x%2==0)x/=2,e[i].first++;
while(x%5==0)x/=5,e[i].second++;
sum+=e[i].second;
}
memset(d,-1,sizeof d);
int s=0,t=1;
d[t][0][0]=0;
for(int i=1;i<=n;i++){
int x=e[i].first,y=e[i].second;
for(int j=0;j<=i&&j<=k;j++){
for(int p=0;p<=sum;p++){
d[s][j][p]=d[t][j][p];
if(j-1>=0&&p-y>=0&&d[t][j-1][p-y]>=0){
d[s][j][p]=max(d[s][j][p],d[t][j-1][p-y]+x);
}
}
}
swap(s,t);
}
int ans=0;
for(int i=0;i<=sum;i++){
ans=max(ans,min(d[t][k][i],i));
}
cout<<ans<<endl;
}
signed main(){
ios::sync_with_stdio(0);cin.tie(0);
solve();
return 0;
}