タイトル説明
我々はすべてキヤノンの書き込み技術のポリフォニーである知っているように、それは音楽カノンを聴きながら、大きな髪より少しのインスピレーションを得た新しい音楽を発明し、ルールを記述します。彼音スケールは、n個に分割され、そして音楽は、いくつかのセグメントに分割されます。各セグメントは、N個の構成、即ち、スケールからのスケールのn個の数の選択は同時に再生する音楽サウンドスケール1です。それが含まれている任意の2つのクリップのキヤノンの異なる、彼は規定のスケール回収と強調することは異なっています。一方、規則の音楽を維持するために、彼はまた、各スケールが偶数の楽曲が再生された回数を提供します。質問は以下のようになります。私は音楽の小断片を知りたいメートルに種の総数が含まれています。音楽の二枚はaとbの場合のみセグメントを再配置することができた後であれば、Bアイソフォーム。例えば:と仮定
{{1,2}、{2,3}}であり、Bは、{{3,2}、{2,1}}であり、Bは音楽の同じ種類です。多くのいくつかのように、あなただけに必要
100000007の回答の結果出力モジュール(素数)。
入力形式
ファイルからデータを読み出すINPUT.TXT、入力ファイルが2つの正の整数n及びmの空間で、特に、唯一のラインであり、それぞれのセグメントの数と規模の音楽の数を表します。データ満たすN、m≤5,50データを満たすの%N、m≤3000,100%の20%
データ満たすN、m≤1000000。
出力フォーマット
OUTPUT.TXT出力ファイルは、音楽100000007デジタル - アナログの唯一の非負整数結果の種類を含んでいます。
強いと除外の問題。
最初の質問は、これを簡略化することが意図されている:集合$ Sから= {1,2,3、...、 N} $ $ M $選択されたサブセットを満たす空でないと選択されたサブセットが同じ持つことができると保証$を{1,2,3 ... N}は$各要素の出現の偶数です。
非常に迷惑で与えられた音楽トピックの同じ種類の定義は、私たちは最初の順列の数を用いて計算し、最終結果が算出され、その後、$ mで割った、障害の注文!$(もちろん、また組み合わせて直接使用することができますか?)。
その後、転送を考えます。定義されたの$ F [i]は$プログラム番号は、すべての条件を満たし、第二の部分集合$ Iの$に転送されます。最初の$ I-1 $サブセットが同定されている場合、これはさえ性質である、私たちは、私は、各要素が表示された回数に基づいてサブセットを$最初の$を決定することができます(奇数のみ前$ I-1 $つ登場選びます要素)。$ A_ {2 ^ N-1} ^ {I-1} $のためのプログラムの合計数。
これは、非空の数が含まれており、これら2つの条件が同じコレクションではありません満たしていません。最初の$のi $のサブセットが空であるならば、最初の$ I-1 $サブセットが正当なプログラムであり、インクルージョン排除を考えてみましょう。だから、プログラム番号の$ F [I-1] $のこの部分。
私たちは、同じサブセットの存在を削除する必要があります。$ I $第一サブセット及び第二サブセットの$ Jの$繰り返した場合、最初の$ $ I $ J番目と$を削除し、プログラム番目の残り$ I-2 $が正当である、$ Fの量[I-2 ] $。このとき、第1のサブセットは$有するI $ $ 2 ^ N-1-(I-2)$をプログラムの種類、および$ $ I $場所の同じサブセットI-1 $、そのプログラム番号のこの部分すなわち倍(2 ^ N-1-(I-2))$ \回\の$ F [I-2](I-1)。
回\回(I-1)\ [I-1] -f [I-2] -f $ F [I] = A_ {2 ^ N-1} ^ {I-1}(^ N-1- 2 (I-2))$
初期化する$ F [0] = 1 $。
// 本当の名前は、チュアンMingmingが問題を解決するには、最大話していないことを私に言ったとき、年が質問を行うディス の#include <cstdioを> する#include <iostreamの> の#include <CStringの> 使用して 、名前空間、STD のtypedef ロング ロングLL; の#defineは、再登録 のconstを INT MOD = 1E8 + 7、N = 1000010 ; LL F [N]、FAC、A [N]、横、N-、M; LL qpow(LL X、LL Y) { LL RES = 1。; 一方、(Y) { IF(Y&1。)RES = RES * X%MOD; X = X * X%MOD; Y>> = 1 。 } 戻りRESと、 } int型のmain() { IOS :: sync_with_stdio(偽)。 cin.tie(0 )。 CIN >> N >> M。 FAC = [ 0 ] = F [ 0 ] = 1 。 ため(再int型、I = 2 FAC = FAC * I%iが++; I <= M)MOD。 FAC = qpow(FAC、mod- 2 )。 側面 = qpow(2、n)は- 1 。 以下のための(再int型 I =1 ; I <= M; iは++)[i]は= [I- 1 ] *(サイドI + 1)%MOD。 ため(再int型、I = 2 ; I <= M; iは++ ) { [i]はfを = [I- 1 ] -f [I- 1 ]。 F [I] - =(F [I- 2 ] *(I- 1)%MOD *(サイドI + 2))%MOD。 F [I] =(MOD + [I]%MOD F)%のMOD。 } COUT << F [M] *のFAC%のMOD << ENDL。 リターン 0 ; }