問題の説明
我々は階乗nは*(N-1)* nは知っている 、1 * ... * 2 *(N-2) 、多因子は、例えば:! 5のために、同様の定義することができます!!= 1 * 5 3、次いでN必要がある可能性があります...!(K '!'、単純に表現することができるなどのn(K)!)= N *(NK)*(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、所与のセットの値は、m = 1、および演算して出力N(1)!+ N( 2)!+ ... + N(K)] であり、m =そして数字2を算出して出力するn個(1)の和!+ N( 2)!+ ... + N(K)! 各ビット。
入力形式
二列、第1行のN kを、第二の線m。
出力フォーマット
行のN(1)!+ N(2)!+ ... + N(K)!または値N(1)!+ N(2)!+ ... + N図および個々のビットの(K)!上。
サンプル入力
5 1
2
2
サンプル出力
3
スケールデータと規則
0 <K <N <= 20
問題解決のアイデア:ブラフ被験者、高精度にそのテンプレート、ルックデータ範囲、最悪の場合は、N = 20、K = 1、20 + 19 + 18 +の最大数です...!長い長いと、十分!を保存することが+1は、質問には、データを見て、後で範囲ありません。参照https://blog.csdn.net/sinat_31275315/article/details/90477866作り、変数値の様々なタイプを含むことによって。
1の#include <ビット/ STDC ++ H>
2 使用して 名前空間STDを、
3 INT メイン(){
4 COUT << " INT的最大最小值" << ENDL。
5 coutの<< INT_MAX << てendl;
6 COUT << INT_MIN << ENDL。
7 裁判所未満<< " 長期的最大最小值" << てendl;
8 COUT << LONG_MAX << ENDL。
9 COUT << LONG_MIN << ENDL。
10の coutの<< "endl;
11 COUT << LONG_LONG_MAX << ENDL。
12 COUT << LONG_LONG_MIN << ENDL。
13 裁判所未満<< " 長い長いunsiged的最大最小值" << てendl;
14 COUT << ULLONG_MAX << ENDL。
15 // 符号なしの長い長い最小值为0
16 coutの<< " フロート的最大最小值" << てendl;
17 coutの<< FLT_MAX << てendl;
18 COUT << FLT_MIN << ENDL。
19の coutの<< "endl;
20 COUT << DBL_MAX << ENDL。
21 COUT << DBL_MIN << ENDL。
22 リターン 0 ;
23 }
1 #include <bits/stdc++.h>
2 using namespace std;
3 int main(){
4 int n, k, m;
5 cin >> n >> k >> m;
6 long long t;
7 long long ans = 0; //ans存储n(1)!+n(2)!+......+n(k)!的值
8 for (int i = 1; i <= k; i++) {
9 t = 1; //t存储n(i)!的值
10 for (int j = n; j > 0; j -= i) {
11 t *= j;
12 }
13 ans += t;
14 }
15 if (m == 1) {
16 cout << ans << endl;
17 } else {
18 int res = 0; //res存储ans这个数各个位上的数字之和
19 while (ans) {
20 res += ans % 10; //拆出每一位
21 ans /= 10;
22 }
23 cout << res << endl;
24 }
25 return 0;
26 }