POJ 1150 The Last Non-zero Digit——阶乘最后非0位

题解:https://blog.csdn.net/tsaid/article/details/7265759

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int table[5][5] = {
    {6,2,4,8},
    {1,3,9,7},
    {1,7,9,3},
    {1,9,1,9}
};
int get2(int n) {
    if (n == 0) return 0;
    return n / 2 + get2(n / 2);
}
int get5(int n) {
    if (n == 0) return 0;
    return n / 5 + get5(n / 5);
}
int g(int n, int x) {
    if (n == 0) return 0;
    return n / 10 + (n % 10 >= x) + g(n / 5, x);
}
int getx(int n, int x) {
    if (n == 0) return 0;
    return getx(n / 2, x) + g(n, x);
}
int main() {
    int n, m;
    while (~scanf("%d%d", &n, &m)) {
        int num2 = get2(n) - get2(n-m);
        int num5 = get5(n) - get5(n-m);
        int num3 = getx(n, 3) - getx(n-m, 3);
        int num7 = getx(n, 7) - getx(n-m, 7);
        int num9 = getx(n, 9) - getx(n-m, 9);
        int res = 1;
        if (num5 > num2) {
            printf("5\n");
            continue;
        }
        else {
            if (num5 != num2) {
                res *= table[0][(num2-num5)%4];
            }
            res *= table[1][num3%4];
            res *= table[2][num7%4];
            res *= table[3][num9%4];
            res %= 10;
        }
        printf("%d\n", res);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/hao_zong_yin/article/details/80259680