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を返します。 }