问题描述
我们知道,阶乘n!表示n*(n-1)*(n-2)*......*2*1, 类似的,可以定义多阶乘计算,例如:5!!=5*3*1,依次可以有n!...!(k个‘!’,可以简单表示为n(k)!)=n*(n-k)*(n-2k)*....(直到最后一个数<=0)。
现给定一组数据n、k、m,当m=1时,计算并输出n(1)!+n(2)!+......+n(k)!的值,m=2时计算并输出n(1)!+n(2)!+......+n(k)!的各个位上的数字之和。
输入格式
两行,第一行为n和k,第二行为m。
输出格式
一行,为n(1)!+n(2)!+......+n(k)!的值或n(1)!+n(2)!+......+n(k)!的各个位上的数字之和。
样例输入
5 1
2
样例输出
3
数据规模和约定
扫描二维码关注公众号,回复:
9919097 查看本文章
0 < k < n <= 20
解题思路:思路很简单,但是要注意数据范围,因为n最大为20( 20! = 2.4329020081766e+18)long long的数据范围为:最大值:9223372036854775807(19位) 最小值:-9223372036854775808,所以应该使用long long。
#include<iostream>
using namespace std;
long long fun(int n,int k){
long long s = 0;
for(int i=1;i<=k;i++){
long long sum = 1;
for(int m=n;m>=1;m -= i){
//cout<<m<<endl;
sum *= m;
}
//cout<<sum<<endl;
s += sum;
}
return s;
}
int main(){
int n,k,m,num_sum = 0;
long long num;
cin>>n>>k;
cin>>m;
if(m == 1){
cout<<fun(n,k);
}else{
num = fun(n,k);
while(num){
num_sum += num%10;
num /= 10;
}
cout<<num_sum;
}
return 0;
}