1381. 阶乘
N 的阶乘(记作 N!)是指从 1 到 N(包括 1 和 N)的所有整数的乘积。
阶乘运算的结果往往都非常的大。
现在,给定数字 N,请你求出 N! 的最右边的非零数字是多少。
例如 5!=1×2×3×4×5=120,所以 5! 的最右边的非零数字是 2。
输入格式
共一行,包含一个整数 N。
输出格式
输出一个整数,表示 N! 的最右边的非零数字。
数据范围
1≤N≤1000
输入样例:
7
输出样例:
4
题解: 一个数的阶乘后面免不了有0,所以我们必须在阶乘过程中除掉所有的因子10,也就是可以配对的因子2和因子5,一个阶乘数相当于 =
2
x
∗
5
y
∗
C
2^x*5^y*C
2x∗5y∗C =
1
0
k
∗
2
x
−
k
∗
5
y
−
k
∗
C
10^k*2^{x-k}*5^{y-k}*C
10k∗2x−k∗5y−k∗C
我们要除掉
1
0
k
10^k
10k,最后对10取余就是不为0的数字
#include<cstdio>
#include<cstring>
#include<iostream>
#include<cmath>
#include<string>
using namespace std;
#define ll long long
const int INF = 0x3f3f3f3f;
#define MAXN 200000
const int N = 100;
int main()
{
int n;
cin>>n;
int x,y;
x = 0;
y = 0;
int ans = 1;
for(int i=1; i<=n; ++i){
ans *= i;
//这里除掉因子2和因子5,并计数
while(ans % 2 == 0) ans /= 2,x++;
while(ans % 5 == 0) ans /= 5,y++;
ans %= 10;
}
//算出可以匹配的2和5,然后把多余的2和5,又乘起来
int k = min(x,y);
for(int i=1; i<=x-k; ++i)
ans = ans *2 %10;
for(int i=1; i<=y-k; ++i)
ans = ans * 5 % 10;
cout<<ans%10<<endl;
return 0;
}