HZOI20190906 39産業シミュレーション、しばしばカード、形而上学

質問表面:https://www.cnblogs.com/Juve/articles/11484209.html

産業:

式、ACを押し

組み合わせの数は使用されません。2時間以上をプッシュ

I sbsbsbsbsbsbsbsbsbsbsbsbsbsbsb

書式#include <iostreamの> 
の#include <cstdioを> 
する#include <CStringの> 
に#define int型、長い長い
名前空間stdを使用。
const int型MAXN = 3E5 + 5。
const int型のmod = 998244353; 
M、A、B、イン[MAXN]、INM [MAXN]、FM [MAXN]、[MAXN] FN、ANS = 0、N int型。
{(int型B、int型のP INT)のint q_pow 
	INT RES = 1。
	(B){一方
		(B&1)であれば、RES = RES%P *%のP。
		=%pは*%pを。
		B >> = 1。
	} 
	戻りRES%のP。
} 
メイン(){署名さ
	//freopen("a_sample2.in","r",stdin)を、
	//freopen("vio.out","w",stdout); 
	scanf関数( "%LLD%LLD%LLD%LLD"、&M、及び、・B&N)。
	%= MOD、B%= MOD。
	「のscanf((I ++; iが<= n iは1 = INT)のために
	scanf関数(」(; I <= M ++ iは1 = INT)のために
	ための式(I = 2をint型、I <= M; ++ i)が{ 
		FM [I] = FM [I-1] *(N-2 + I)%MOD * q_pow(I-1、MOD-2、MOD )%のMOD。
		// coutの<< FM [i]は<<てendl; 
	} 
	FN [1] = 1。
	{(; iが<= N ++ I iは2 = INT)のための
		FN [I] = FN [I-1] *(M-2 + I)%MOD * q_pow(I-1、MOD-2、MOD )%のMOD。
		// coutの<< FN [i]は<<てendl; 
	} 
	{ため(++ I; iは= N <I = 1 INT)
		< '// COUT << I <<' '<< 0 <<' '<< FN [N-I + 1] <<' <M <<」「<< NI << ENDL。
		(ANS + =イン[I]%MOD * FNを[NI + 1]%MOD * q_pow(M、MOD)%MOD * q_pow(B、NI、MOD)%のMOD)%= MOD。
	} 
	ため(INT I = 1; I <= M; ++ I){ 
		// COUT << 0 << ' '<< I <<'' < 
		(ANS + = INM [I]%MOD * FM [M + 1]%MOD * q_pow(MI、MOD)%MOD * q_pow(B、N、MOD)%のMOD)= MOD%。
	}
	printf( "%LLDする\ n"、ANS%のMOD)。
	0を返します。
}

カード・チャン:

ツリーリングDP

書式#include <iostreamの> 
の#include <cstdioを> 
する#include <CStringの> 
の#include <アルゴリズム> 
書式#include <cmath> 
に#define再登録
名前空間stdを使用。
const int型MAXN = 1E6 + 5。
整数nを、A、B、ANS = 0x7FFFFFFFで。
[MAXN << 1]、NXT [MAXN << 1]、[MAXN]、ヴァル[MAXN]、CNT = 1を事前にINT 
インラインボイド追加(再INT U、再INT V){ 
	CNT ++、に[CNT] = V、NXT [CNT] =予備[U]は、[U] = CNTを事前。
} 
BOOL VIS [MAXN]。
INT ST編、エッジ、F [MAXN]、G [MAXN]。
インラインボイドDFS(INT再X、INT FA、再int型のID RE){ 
	IF(VIS [X]){ 
		エッジ= ID。
		ST = FA、エド= xと; 
		返します。
	} 
	VIS [X] = 1。
	以下のための(I = [X]事前INT再; Iは、I = NXT [I]){ 
		int型、Y再= [I]に。
		もし(Y == FA)続けます。
		DFS(Y、X、I)。
	} 
} 
インラインボイドDFS(int型のX再再INT FA){ 
	G [X] = 0、F [X] = valの[X]。
	以下のための(I = [X]事前INT再; Iは、I = NXT [I]){ 
		int型、Y再= [I]に。
		もし(Y == FA)続けます。
		IF(エッジ== I ||エッジ==(I ^ 1))続けます。
		DFS(Y、X)。
		F [X] + =分(G [Y]、F [Y])。
		G [X] + = F [Y]。
	} 
} 
(){主符号付き
	のscanf( "%D%D%D"、&N、&A、&B); 
	用(RE INT i = 1; I <= N; ++ I){ 
		int型再X、Y。
		scanf関数( "%dの%のD"、およびX&Y)。
		追加し、(X、Y)を追加(Y、X)。
		ヴァル[X] + =、ヴァル[Y] + = B。
	} 
	DFS(1,0,0)。
	DFS(ST、0); 
	ANS =分([ST] F、ANS)。
	DFS(編、0);
	ANS =分([編]、ANS F)。
	printf( "%d個の\ n"、ANS)。
}

形而上学:

パリティ-1 D(私はjは*)と判断された電源。

D(x)が偶数で、効果はありません、我々はD(x)が奇数時間で検討し、

この時点で、xは完璧な正方形である、と考えるのは難しいことではありません。

私たちは、私がp * qを^ 2 $(正方形ではないP因子)$、およびjは$ pが* rを^ 2 $の形で存在しなければならないことに分割し、

したがって、各I、そこに$ \ sqrtの{\ FRAC {M} {P}} $ jに対して貢献を生成します。

Pを求める方法として、線形篩であることができます。

私たちは、素数pが自身であることを知っています

その後、ふるいのような

 

#include <iostreamの> 
する#include <cstdioを> 
する#include <CStringの> 
する#include <アルゴリズム> 
の#include <cmath> 
使用して名前空間std。
const int型MAXN = 1E7 + 2。
長い長N、M、ANS = 0。
INTプライム[MAXN]、VIS [MAXN]、P [MAXN]、TOT; 
ボイドget_p(長い長N){ 
    VIS [1] = P [1] = 1。
    以下のために(INT I = 2; iは= N <; iは++){ 
        IF(VIS [I]!)プライム[++ TOT = I、P [I] = I。
        用(INTのJ = 1; J <= TOT && iが素数[j]を* <= nであり、j ++){ 
            VIS [i *が素数[J] = 1。
            IF(!(P [I]%プライム[J])){ 
                P = P [i]は/プライム[J] [iがj]は[プライム*]。
                ブレーク; 
            } 
            他のp [iの[プライム* J] = P [i]は* P [j]の[プライム]。
} 
    のscanf( "%のLLDの%のLLD"、&N、&M)。
    get_p(N)
	以下のために(; iは= N <; I = int型1 ++ I){ 
		int型の和= SQRT(M / P [I])。
		IF(合計%2)--ans。
		他++ ANS; 
	} 
    のprintf( "%LLDする\ n"、ANS)。
    0を返します。
}

 

おすすめ

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