1
  1. 変数 test は、後続のテスト ケースの数です。
  2. 関数 factorial は数値の階乗を返します
  3. 関数 summ は、1 から n nCk までの k の合計を返します

これが私のコードです:

#include<stdio.h>
float factorial(int x)
{
    if(x==1)
    return 1.0;
    else
    return (x*factorial(x-1));
}
int summ(int y)
{
    int k=1;double sum=0;int r;
    while(k<=y)
    {
        sum=sum +((factorial(y))/(factorial(y-k)*factorial(k)));
        k++;
    }
    r=(int)sum%(int)((1000000007.00));
    return r;
}
main()
{
    int test;
    scanf("%d",&test);int j=0;
    int i=0;int arr[test];int val;int flag;
    while(i<test)
    {
        scanf("%d",&val);
        flag=summ(val);
        arr[i]=flag;
    i++;
    }
    while(j<test)
    {
        printf("%d\n",arr[j] );
        j++;
    }
    return 0;
}
4

4 に答える 4

4

ヒントとして、二項定理を調べてください。

(n は 0 を選択) + (n は 1 を選択) + ... + (n は n を選択) = 2 n

これは、ビット シフトを使用して 1 行のコードで計算できます。

お役に立てれば!

于 2013-11-14T05:33:27.587 に答える
1

階乗関数 Do if(n==1||n==0) return 1; .....

于 2013-11-14T05:31:25.503 に答える
1

(nC1 + nC2 + nC3...nCn) = 2^n - 1 二項定理を使用

2^n は高速累乗を使用して O(logn) で評価できます

高速累乗

于 2013-11-14T06:24:00.883 に答える
0

プログラムを修正するには、再帰が 0 から -1、-2、-3 などになるため、関数がクラッシュするx = 0ことに注意してください。factorialsummk = yfactorial(0)

ただし、プログラムを修正するだけでなく、効率的な方法で問題を解決するには、templatetypedefのアイデアを参照する必要があります。

于 2013-11-14T06:26:49.877 に答える