1≤N≤50,000,000 这个数据量 看到了吗?
这代表不能先算完再处理 (50000000!太大 存储不下)
得边算比处理
我们知道这题的罪魁祸首 2 和 5 因为2*5=10
首先我们就制裁他们,把他们单独拎出来
int ans = 1, sum2 = 0, sum5 = 0;
for (int i = 2; i <= n; i ++) {
int t = i;
while (t % 2 == 0) {
sum2 ++;
t /= 2;
}
while (t % 5 == 0) {
sum5 ++;
t /= 5;
}
ans = ans * t % 10;
}
因为能被2整除的数 比 能被 5 整除的数 要多, 所以在他们俩的配对中(2*5 = 10 一个2和一个5)总会多出一些2
我们吧没有玩伴2从新放入答案
sum2 -= sum5;
while (sum2 --)
ans = ans * 2 % 10;
code:
#include <iostream>
using namespace std;
int main() {
int n;
scanf ("%d", &n);
int ans = 1, sum2 = 0, sum5 = 0;
for (int i = 2; i <= n; i ++) {
int t = i;
while (t % 2 == 0) {
sum2 ++;
t /= 2;
}
while (t % 5 == 0) {
sum5 ++;
t /= 5;
}
ans = ans * t % 10;
}
sum2 -= sum5;
while (sum2 --)
ans = ans * 2 % 10;
cout << ans % 10;
return 0;
}
扫描二维码关注公众号,回复:
16641039 查看本文章