本文主要是介绍游游的选数乘积,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
题目描述
游游拿到了一个数组,她准备在其中选择两个数,使得乘积的末尾至少有x个0。游游想知道,至少有多少种不同的取数方法?
输入描述:第一行输入两个正整数n和x,代表数组的大小以及乘积末尾0的数量。第二行输入n个正整数ai,代表游游拿到的数组。1≤n,x≤10^5,1≤ai≤10^9
输出描述:输出一个整数,代表游游选择的方案数。
#include <iostream>
#include <vector>
using namespace std;
const int MAX_R = 40, MAX_C =20;
int main() {vector<vector<int>> cnt(MAX_R, vector<int>(MAX_C));int n, x;cin >> n >> x;for (int i = 0; i < n; ++i) {int ai;cin >> ai;int p2 = 0, p5 = 0;while (ai % 2 == 0) {p2++, ai /= 2;}while (ai % 5 == 0) {p5++, ai /= 5;}cnt[p2][p5]++;}long long ans = 0;for (int i = 0; i < MAX_R; ++i) {for (int j = 0; j < MAX_C; ++j) {for (int i2 = max(0, x - i); i2 < MAX_R; ++i2) {for (int j2 = max(0, x - j); j2 < MAX_C; ++j2) {ans += (i == i2 && j == j2 ? cnt[i][j] * (cnt[i][j] - 1LL) : cnt[i][j] * cnt[i2][j2]);}}}}cout << ans / 2 << endl;return 0;
}
这篇关于游游的选数乘积的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!