列表

详情


NC257435. 游游的选数乘积

描述

游游拿到了一个数组,她准备在其中选择两个数,使得乘积的末尾至少有x个0。游游想知道,至少有多少种不同的取数方法?

输入描述

第一行输入两个正整数nx,代表数组的大小以及乘积末尾0的数量。
第二行输入n个正整数a_i,代表游游拿到的数组。
1\leq n,x \leq 10^5
1\leq a_i \leq 10^9

输出描述

输出一个整数,代表游游选择的方案数。

示例1

输入:

5 2
3 5 50 2 80

输出:

3

说明:

5*80=400,末尾有2个0。
50*2=100,末尾有2个0。
50*80=4000,末尾有3个0。
有以上3种方案满足乘积至少有2个0。

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++(clang++ 11.0.1) 解法, 执行用时: 192ms, 内存消耗: 424K, 提交时间: 2023-08-13 21:14:33

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=1e5+5;
int n,x,f[32][32];
ll ans;
int main()
{
    scanf("%d%d",&n,&x);
    for(int i=1;i<=n;i++)
    {
        int u,k2=0,k5=0;
        scanf("%d",&u);
        while(u%2==0)k2++,u/=2;
        while(u%5==0)k5++,u/=5;
        for(int j=0;j<32;j++)
        for(int l=0;l<32;l++)
        if(k2+j>=x&&k5+l>=x)ans+=f[j][l];
        f[k2][k5]++;
    }
    printf("%lld\n",ans);
}

pypy3 解法, 执行用时: 393ms, 内存消耗: 30880K, 提交时间: 2023-08-13 20:19:39

def read_ints():
    return [int(x) for x in input().split(' ')]

n,x=read_ints()
a=read_ints()

res=0
f=[[0]*30 for _ in range(13)]
fs=[0]*13

for i in range(n):
    f2=f5=0
    while a[i]%2==0:
        a[i]//=2
        f2+=1
    while a[i]%5==0:
        a[i]//=5
        f5+=1

    for i in range(max(0,x-f5),13):
        if fs[i]==0:continue
        res+=sum(f[i][max(0,x-f2):])

    f[f5][f2]+=1
    fs[f5]+=1

print(res)

C++(g++ 7.5.0) 解法, 执行用时: 186ms, 内存消耗: 448K, 提交时间: 2023-08-13 19:21:45

#include<bits/stdc++.h>
#define ll long long
using namespace std;
int sum[35][35],n,k,x; ll ans;
int main(){
	std::ios::sync_with_stdio(false);
	cin>>n>>k;
	for(int i=1;i<=n;i++){
		cin>>x;
		int tot1=0,tot2=0;
		while(x%2==0)tot1++,x/=2;
		while(x%5==0)tot2++,x/=5;
		for(int a=0;a<=31;a++)
		for(int b=0;b<=31;b++)
		if(tot1+a>=k&&tot2+b>=k) 
		ans+=sum[a][b];
		sum[tot1][tot2]++;
	}
	cout<<ans;
	return 0;
}

上一题