AcWing 1381. 阶乘
原题链接
简单
作者:
wjslyk
,
2024-09-08 16:55:06
,
所有人可见
,
阅读 1
答案做法:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int N=1010;
int p[N];
int r;
int f[N]; //f[i]表示质数i的次数
int main()
{
int n;
int t1=0,t2=0;
cin>>n;
long long int res=1;
for(int i=2;i<=n;i++){
int k=i;
while(k%2==0){
k=k/2; t1++;
}
while(k%5==0){
k=k/5; t2++;
}
res=res*k%10;
}
int t=min(t1,t2);
for(int i=0;i<t1-t;i++) res=res*2%10;
for(int i=0;i<t2-t;i++) res=res*5%10;
cout<<res%10<<endl;
return 0;
}
第一次做法
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int N=1010;
int p[N];
int r;
int f[N]; //f[i]表示质数i的次数
int main()
{
int n;
cin>>n;
//首先将n!质因数分解,去掉10的因子,再对剩下的因子之积%10
//一、质因数分解
for(int j=2;j<=n;j++){ //遍历1-n
int k=j;
//对k质因数分解
for(int i=2;i<=k/i;i++){
int cnt=0;
while(k%i==0){
cnt++;
k=k/i;
}
if(cnt>0){
if(f[i]==0) p[r++]=i;
f[i]+=cnt;
}
}
if(k>1) {
if(f[k]==0) p[r++]=k;
f[k]+=1;
}
}
//二、去掉10的因子
int t=min(f[2],f[5]);
f[2]-=t; f[5]-=t;
//三、对剩下的因子之积%10
int res=1;
for(int i=0;i<r;i++){
int q=p[i];
// q的次数是f[q]
for(int j=0;j<f[q];j++) res=res*q%10;
}
cout<<res<<endl;
return 0;
}
另一种做法
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int N=1010;
int p[N];
int r;
int f[N]; //f[i]表示质数i的次数
int main()
{
int n;
cin>>n;
long long int res=1;
for(int i=2;i<=n;i++){
res=res*i;
while(res%10==0){ //每次去0
res=res/10;
}
res%=10000; //每次只计算后4位
}
cout<<res%10<<endl;
return 0;
}