NC257435. 游游的选数乘积
描述
输入描述
第一行输入两个正整数和,代表数组的大小以及乘积末尾的数量。
第二行输入个正整数,代表游游拿到的数组。
输出描述
输出一个整数,代表游游选择的方案数。
示例1
输入:
5 2 3 5 50 2 80
输出:
3
说明:
5*80=400,末尾有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; }