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\n", ans);
	return 0;
	}
posted @ 2018-08-22 21:02  Tony_Double_Sky  阅读(206)  评论(0编辑  收藏  举报