問題描述
我們知道,階乘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
數據規模和約定
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;
}