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