洛谷 P1134 [USACO3.2]阶乘问题

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 查看本文章

猜你喜欢

转载自blog.csdn.net/weixin_71529971/article/details/129765874
今日推荐