質問表面:https://www.cnblogs.com/Juve/articles/11606834.html
バツ:
差分セットは、二つの要素、コレクションに割り当てることができないと一緒に、提供される通信ブロックCNTの数が、答えは:$ 2 ^ CNT-2の$
#include <iostreamの> する#include <cstdioを> する#include <CStringの> する#include <ベクトル> の#include <アルゴリズム> の#include <ベクトル> の#define再登録 の#defineが長いlong int型 名前空間stdを使用。 const int型MAXN = 1E5 + 5。 const int型MOD = 1E9 + 7。 整数nを、[MAXN]、T、ANS、NUM。 インラインINT GCD(RE INT A、REはint b)は{ 戻りB == 0:GCD(B、%b)は、? } インラインINT q_pow(再int型のB INT再度、再INT P){ 再INT RES = 1。 一方、(B){ IF(B&1)RES =のRES *%のP。 = A *%pを。 B >> = 1。 } RESを返します。 } int型FA [MAXN]。 インラインint型の検索(RE INT X){ [X] =(?FA [X] == X X:(FA [X])を見つける)FAを返します。 } ベクトル<整数> V [MAXN * 10]。 INTプライム[MAXN * 10]、VIS [MAXN * 10]、TOT = 0、PRI [MAXN * 10]。 ボイドget_prime(int型N){ VIS [1] = 1。 以下のために(; N = iは<; I = 2 iがint型++){ IF(VIS [I]!)プライム[++ TOT = I、PRI [I] = TOT。 用(INTのJ = 1; J <= TOT && iが素数[j]を* <= N; J ++){ VIS [i *が素数[J] = 1。 (もし!(I%、プライム[J]))休憩。 } } } (INT POS再INT X、RE)インラインボイドディビ{ ため(再I = 1 INT; I <= TOT &&プライム[I] *プライム[I] <= xと; ++ i)が{ (X%のプライムなら[I] == 0){ V [i]は.push_back(POS)。 一方、(X%のプライム[I] == 0)は、x / =プライム[I]。 } } もし(X> 1)V [PRI [X]]一back(POS)。 } INT MAXX = 0。 のprintf( "%LLDする\ n"、((q_pow(2、NUM、 メイン(){署名さ get_prime(1E6)を、 scanf関数( "%のLLD"、&T)。 一方、(T - ){ scanf関数( "%のLLD"、&N); ANS = NUM = MAXX = 0。 用(RE INT i = 1; I <= N; ++ I){ FA [I] = I。 scanf関数( "%のLLD"、および[I])。 ディビ([i]は、I)。 MAXX = MAX(MAXX、[I])。 } {ため(; I <= TOT &&プライム[I] <= MAXX ++ I I = 1 INT) INT N = V [i]を.size()。 (N == 0)が継続する場合。 INT P =(V [i]が[0])を見つけます。 用(INT J = 1、J <N; ++ J){ int型Q =(V [I] [J])を見つけます。 もしFA [Q]は、P =(P = Q!)。 } V [I] .clear(); } ための式(I = 1をint型、iが<= N; I ++){ (FA [I] == I)の場合++ NUM。 } } 0を返します。 }
そして、:
定義DP:[I] [J] [k]はダウンI-ステップを示し、F、現在の点はjは、状態kが存在する状態か否かを示す、ブール配列であります
スペースを節約するために、我々は、最初の次元とだけ$ \ FRAC {D} {2} $、三次元のみ$ 2 ^ {\ FRAC {D} {2}} $という二つの部分を、転送しました
初期状態:$ F1 [0] [1] [0] = 1、f2は[0] [i]とは、[0]、1は$(iがnで\します)=
私たちは、接続転送、および最終的には国家統計的な答えは、2つの配列であるとDPと
#include <iostreamの> する#include <cstdioを> する#include <CStringの> する#include <アルゴリズム> の#include <ベクトル> 使用して名前空間std。 const int型MAXN = 95; N INT、M、D、LEN1、LEN2、ANS = 0。 BOOL CAL1 [13] [MAXN] [(1 << 13)+5]、CAL2 [13] [MAXN] [(1 << 13)+5]。 ベクター<ペア<整数、整数>> MP [MAXN]。 メイン(){署名付き のscanf( "%D%D%D"、&N、&M、&D)を、 LEN1 = D / 2、LEN2 = D-LEN1。 CAL1 [0] [1] [0] = 1。 CAL2 [0] [i]が[0] = 1;(; iが<= N I ++ i = 1 INT)のために (I = 1、U、V、Cのint型、I <= M; ++ i)について{ scanf関数( "%D%D%D"、&U&V、&C)。 MP [U] .push_back(make_pair(V、C))。 MP [V] .push_back(make_pair(U、C))。 } 、I = 0をINT(ため、 用(int型J = 0であり、j <Sであり; ++ j)の ための(INT K = 1; K <= N; ++ K){ int型N = MP [K] .size()。 用(int型P = 0; p <N; ++ P) CAL1 [I + 1] [MP [K] [P] 1次回] [(J << 1)+ MP [K] [P] .second] | = CAL1 [i]の[K] [J]。 } } のために(INT i = 0; I <LEN2; ++ I){ int型、S =(1 << I)。 用(int型J = 0であり、j <Sであり; ++ j)の ための(INT K = 1; K <= N; ++ K){ int型N = MP [K] .size()。 用(int型P = 0; p <N; ++ P) CAL2 [I + 1] [MP [K] [P] 1次回] [(J << 1)+ MP [K] [P] .second] | = CAL2 [i]の[K] [J]。 } } のために(; iは(1 << D)を<; I = 0 int型++ I) のために(int型J = 1; J <= N; ++ j)の 場合(CAL1 [LEN1] [j]は[I> > LEN2] && CAL2 [LEN2] [j]は[I&((1 << LEN2)-1)]){ ++ ANS。 ブレーク; 0を返します。 }
と:
全客室には、いくつかを作るために、唯一まあマークを付けることができ、タイトル小麦粉を探しに行きます