https://atcoder.jp/contests/agc047/tasks/agc047_a
题意
输入n个最多9位小数的浮点数,计算有多少对数乘积恰好是“整数”。
思路
其实就是看每个数2和5的因子个数,加起来大于分母即可。
可以对所有数按照2和5的因子计数,这样规模会很小(不到15*15)
暴力for即可。
代码
void solve(int kaseId = -1) {
int n;
cin >> n;
map<pair<int, int>, int> cnt;
for (int i = 1; i <= n; ++i) {
long double ai;
cin >> ai;
ll val = (ll) (ai * 1000000000.0 + 0.5);
ll cnt2 = 0;
ll cnt5 = 0;
while (val % 2 == 0) {
cnt2++;
val /= 2;
}
while (val % 5 == 0) {
cnt5++;
val /= 5;
}
cnt[make_pair(cnt2, cnt5)]++;
}
ll ans = 0;
for (const auto &pi: cnt) {
for (const auto &pj: cnt) {
if (pi.first.first + pj.first.first >= 18 &&
pi.first.second + pj.first.second >= 18) {
if (pi == pj) {
ans += pi.second * (pi.second - 1ll);
} else {
ans += pi.second * 1ll * pj.second;
}
}
}
}
// debug(cnt);
cout << ans / 2 << endl;
}
后记
原来签到题都这么难啊。打扰了。