組合せ論+逆

http://oj.jxust.edu.cn/contest/Problem?id=1702&pid=6

質問の意味:ありNの人々が、今のパーティーがあり、誰もが参加する参加するかしないかを選択することができます。そしてだけ皆かの男性は、ギフト、または単に贈り物を送信します。すべての例すべての贈り物やギフトの不在(そのいずれかは、誰もが贈り物、ギフトを受け入れるように誰を送信されません)。場合がありますどのように多くの依頼?

出力:結果mod1e9 + 7。

溶液:ANS =ΣC(K、N)*(2 ^ K-2)ここで、2 <= K <= N

//#含める<ビット/ STDC ++。H> 
の#include <cstdioを> 
する#include <CStringの> 
する#include <cmath> 
の#include <アルゴリズム> 
の#include <iostreamの> 
する#include <アルゴリズム> 
の#include <iostreamの> 
する#include <cstdioを> 
書式#include <文字列> 
の#include <CStringの> 
書式#include <stdio.hに> 
する#include <キュー> 
の#include <スタック>。
#include <マップ> 
の#include <セット> 
の#include <のctype.h> 
の#include <string.hの> 
する#include <ベクトル> 
の#define ME(x、y)はmemsetの(X、Y、はsizeof(X))
の#define SF(N)のscanf( "%d個"、&N)
(INTのための#define担当者(I、N)は、i = 0; iは<N。
名前空間stdを使用。
長い長いLLのtypedef。
const int型MOD = 1E9 + 7。

(LL X、LLのY)quickpowっ
{ 
    LL ANS = 1。
    一方、(Y)
    { 
        IF(Y&1)
            ANS =(ANS * X)%のMOD。
        Y >> = 1。
        X =(X * X)%のMOD。
    } 
    ANS%MODを返します。
} 

int型のmain()
{ 
    int型のn; 
    scanf関数( "%のD"、&N); 
    (N == 1)であれば
    { 
        COUT << 1 << ENDL。
        0を返します。
    } 
    IF(N == 2)
    { 
        COUT << 2 << ENDL。
        0を返します。
    } 

    LL X = N、Y = 1、ANS = 0。
    (; <I = N; INT iは2 = ++ i)について
    { 
        X =(X *(N - I + 1))%のMOD、Yは、Yは、I%MODを* =。
        ANS =(ANS + X * quickpow(Y、MOD - 2)%MOD *(quickpow(2、I) - 2))%のMOD。
    } 
    COUT << ANS << ENDL。

    0を返します。
}

 二つの配列を探しています

//#含める<ビット/ STDC ++。H> 
の#include <cstdioを> 
する#include <CStringの> 
する#include <cmath> 
の#include <アルゴリズム> 
の#include <iostreamの> 
する#include <アルゴリズム> 
の#include <iostreamの> 
する#include <cstdioを> 
書式#include <文字列> 
の#include <CStringの> 
書式#include <stdio.hに> 
する#include <キュー> 
の#include <スタック>。
#include <マップ> 
の#include <セット> 
の#include <のctype.h> 
の#include <string.hの> 
する#include <ベクトル> 
の#define ME(x、y)はmemsetの(X、Y、はsizeof(X))
の#define SF(N)のscanf( "%d個"、&N)
(INTのための#define担当者(I、N)は、i = 0; iは<N。
名前空間stdを使用。
        0を返します。
長い長いLLのtypedef。
const int型MOD = 1E9 + 7。
[100009]、M [100009]をちゃいます。

(LL X、LLのY)quickpowっ
{ 
    LL ANS = 1。
    一方、(Y)
    { 
        IF(Y&1)
            ANS =(ANS * X)%のMOD。
        Y >> = 1。
        X =(X * X)%のMOD。
    } 
    ANS%MODを返します。
} 

int型のmain()
{ 
    int型のn; 
    scanf関数( "%のD"、&N); 
    (N == 1)であれば
    { 
        COUT << 1 << ENDL。
        0を返します。
    } 
    IF(N == 2)
    { 
        COUT << 2 << ENDL。
    } 
    [1] = 1、M [0] = 1; 
    ため(INT iは2 =; I <= N; I ++)
    { 
        [I] = [I-1] * I%MOD。
    } 
    M [N] = quickpow([n]は、MOD-2)。
    用(INT I = N - 1; I> = 1; I - )//可以将逆元看成是倒数求解
    { 
        M [I] = M [I + 1] *(I + 1)%MOD ; 
    } 
    LL ANS = 0。
    以下のために(INT I 2 =; I <= N; I ++)
    { 
        ANS + = A [N]%のMOD * M [i]は%MOD * M [NI]%MOD *(quickpow(2、I)-2)%をモッド; 
        ANS%= MOD。
    } 
    COUT << ANS << ENDL。

    0を返します。
}

おすすめ

転載: www.cnblogs.com/nonames/p/12078816.html