P1134 阶乘问题

P1134 阶乘问题

题意 : 求出 (n!) 去掉后导 (0) 之后的最后一位

Solution

首先后导 (0) 最简单是由 (2 * 5) 得来的
于是想到一个骚操作, 先把每个数的 (2, 5) 提出来, 一对一对地消掉, 就把后导 (0) 去掉了
因为在 (1-n) 中因子 (2) 一定比 (5) 多, 所以最后让 2 的个数减去 5 的个数
然后对于剩下的 (2) 不想写快速幂
发现只用保留最后一位, 然后最后一位以 (4) 为周期反复
于是就 (A)

Code

#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
#include<algorithm>
#include<climits>
typedef long long LL;
using namespace std;
int RD(){
    int out = 0,flag = 1;char c = getchar();
    while(c < '0' || c >'9'){if(c == '-')flag = -1;c = getchar();}
    while(c >= '0' && c <= '9'){out = out * 10 + c - '0';c = getchar();}
    return flag * out;
    }
int n, ans = 1;
int num5, num2;
int change(int x){
	while(x % 5 == 0)num5++, x /= 5;
	while(x % 2 == 0)num2++, x /= 2;
	return x;
	}
int last[4] = {6, 2, 4, 8};
int main(){
	n = RD();
	for(int i = 1;i <= n;i++){
		ans = (ans * change(i)) % 10;
		}
	num2 -= num5;
	ans = (ans * (last[num2 % 4])) % 10;
	printf("%d
", ans);
	return 0;
	}
原文地址:https://www.cnblogs.com/Tony-Double-Sky/p/9520367.html