CSP-Sシミュレーション54X、Y、Z解釈

質問表面: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を返します。
}

と:

全客室には、いくつかを作るために、唯一まあマークを付けることができ、タイトル小麦粉を探しに行きます

おすすめ

転載: www.cnblogs.com/Juve/p/11606844.html