1. 程式人生 > >UOJ#428. 【集訓隊作業2018】普通的計數題(牛頓迭代)

UOJ#428. 【集訓隊作業2018】普通的計數題(牛頓迭代)

傳送門

題解:
把0操作看做是葉子,1操作看做非葉節點,一個操作在另一個操作刪除,則另一個操作為這個操作的父親,於是轉化成了滿足以下條件的nn個點的樹的計數:
1.父親標號>兒子。
2.若一個點為非葉節點,記其兒子中葉子節點的數量為TT,則若其兒子中有非葉節點,TAT\in A,否則TBT \in B
首先可以發現的是BB集合中有沒有0都無所謂(因為必須選非空序列),所以假設其0次項為1。

然後就類似無根樹計數的方法(這裡注意大小為1的是有序的,其餘是無序的),把他的兒子給拼出來,我們可以列舉有幾個非葉節點作為兒子,則:
fn=[n1B]+i[iA]k1k!

i=1kai=n1i,ai2(n1)!i!ai!ifaif_n = [n-1 \in B] + \sum_{i}[i \in A]\sum_{k}\frac{1}{k!}\sum_{\sum_{i=1}^k a_i=n-1-i,a_i \ge 2} \frac{(n-1)!}{i!\prod a_i!}\prod_i{f_{a_i}}

兩邊除個n!n!,得到:
nfnn!=[n1B](n1)!+i[iA]i!k1k!j

=1kai=n1i,ai2faiai!n\frac{f_n}{n!} = \frac{[n-1 \in B]}{(n-1)!} + \sum_{i}\frac{[i \in A]}{i!} \sum_{k}\frac{1}{k!}\sum_{\sum_{j=1}^k a_i=n-1-i,a_i \ge 2}\prod{\frac{f_{a_i}}{a_i!}}

不妨設F=i=1fii!xiF=\sum_{i=1}^{\infty}\frac{f_i}{i!}x^i

,可以得到:
F=B+A(eFx1)=AexeF+(BA)\begin{matrix} F' &=& B+A(e^{F-x}-1) \\ &=& Ae^{-x}e^{F}+(B-A) \end{matrix}

C=Aex,D=BAC=Ae^{-x},D=B-A,化簡一下:
F=CeF+DF' =Ce^{F}+D

我們只需要解這個方程就行啦!

怎麼解呢,可以用牛頓迭代法,先假設一下我們知道f0=f mod xn2f_0 = f \bmod{x^\frac{n}{2}},考慮怎麼求f mod xnf \bmod {x^n}

可以得到:
FCef0+D+Cef0(ff0)(modxn)F' \equiv Ce^{f_0}+D+Ce^{f_0}(f-f_0) \pmod {x^n}

整理一下常量,發現其實是要解這個方程:
F=TF+ZF' = TF+Z

這個可以先設U=TUU'=TU,解出UU:
dUdx=TUU1dU=TdxlnU=TdxU=eTdx\begin{aligned} \frac{dU}{dx} = TU \\ U^{-1}dU=Tdx \\ \ln U=\int Tdx\\ U= e^{\int Tdx} \end{aligned}

然後設V=U1FV=U^{-1}F,則:
(UV)=TUV+ZUV+UV=UV+ZV=ZU\begin{aligned} (UV)'=TUV+Z \\ U'V+UV'=U'V+Z \\ V=\int \frac{Z}{U} \end{aligned}

然後F=UVF=UV,這道題就做完辣,時間複雜度O(nlogn)O(n \log n)

#include <bits/stdc++.h>
using namespace std;

const int RLEN=1<<18|1;
inline char nc() {
	static char ibuf[RLEN],*ib,*ob;
	(ib==ob) && (ob=(ib=ibuf)+fread(ibuf,1,RLEN,stdin));
	return (ib==ob) ? -1 : *ib++;
}
inline int rd() {
	char ch=nc(); int i=0,f=1;
	while(!isdigit(ch)) {if(ch=='-')f=-1; ch=nc();}
	while(isdigit(ch)) {i=(i<<1)+(i<<3)+ch-'0'; ch=nc();}
	return i*f;
}

const int N=1e6+50, mod=998244353;
inline int add(int x,int y) {return (x+y>=mod) ? (x+y-mod) : (x+y);}
inline int dec(int x,int y) {return (x-y<0) ? (x-y+mod) : (x-y);}
inline int mul(int x,int y) {return (long long)x*y%mod;}
inline int power(int a,int b,int rs=1) {for(;b;b>>=1,a=mul(a,a)) if(b&1) rs=mul(rs,a); return rs;}
inline int sgn(int x) {return (x&1) ? (mod-1) : 1;}

namespace FFT {
	const int G=3;
	int A[N],B[N
            
           

相關推薦

UOJ#428. 集訓隊作業2018普通計數牛頓

傳送門 題解: 把0操作看做是葉子,1操作看做非葉節點,一個操作在另一個操作刪除,則另一個操作為這個操作的父親,於是轉化成了滿足以下條件的nnn個點的樹的計數: 1.父親標號>兒子。 2.若一個點為非葉節點,記其兒子中葉子節點的數量為TTT,則若其兒子中有

uoj#418. 集訓隊作業2018三角形線段樹合併

傳送門 好迷啊……膜一下ljz 考慮每個操作,如果把操作按先後順序放到序列上的話,操作一就是把\(w_i\)的石子放到某個節點,那麼就是在序列末端加入\(w_i\),然後根據貪心肯定要把它所有兒子的石子拿走,也就是要減去\(\sum w_{son}\) 那麼每個點的答案就是序列的最大字首 因為父親節點

UOJ#422集訓隊作業2018小Z的禮物min-max容斥,輪廓線dp

【UOJ#422】【集訓隊作業2018】小Z的禮物(min-max容斥,輪廓線dp) 題面 UOJ 題解 毒瘤xzy,怎麼能搬這種題當做WC模擬題QwQ 一開始開錯題了,根本就不會做。 後來發現是每次任意覆蓋相鄰的兩個,那麼很明顯就可以套\(min-max\)容斥。 要求的就是\(max(All)\)

集訓隊作業2018取名字太難了 任意模數FFT

題目大意   求多項式 \(\prod_{i=1}^n(x+i)\) 的係數在模 \(p\) 意義下的分佈,對 \(998244353\) 取模。   \(p\) 為質數。   \(n\leq {10}^{18},p\leq 250000\) 題解   我們只計算 \([1,p-1]\) 的分佈,最

集訓隊作業2018矩陣玩小凹 NTT

題目大意   有一個 \(n\times m\) 的矩陣 \(A\),每個元素都是 \([0,1]\) 內的等概率隨機實數,記 \(s_i=\sum_{j=1}^mA_{i,j}\),求 \(\lfloor\min s_i\rfloor^k\) 的期望。   對 \(998244353\) 取模。   

集訓隊作業2018XSY3372取石子 DP

題目大意   有 \(n\) 堆石子,初始時第 \(i\) 堆石子有 \(a_i\) 個。   你每次取石子會取 \(k\) 個。在你取完一堆石子之後才能在下一堆中取石子。   遊戲會進行 \(t\) 輪,每輪會發生以下事件: 你可以進行任意次取石子操作。 每堆的石子個數會增加,具體的,第

bzoj4765普通計算姬雙重分塊

efi ref space include pos gif signed problem 。。   題目傳送門:http://www.lydsy.com/JudgeOnline/problem.php?id=4765   這道題已經攢了半年多了。。。因為懶,一直沒去寫。。

2018.09.26TJOI2017BZOJ4888洛谷P3760異或和樹狀陣列差分

洛谷傳送門 解析: 額,TJOITJOITJOI連續兩年考了位運算。。。 我還能說什麼。。。 PS:zxyoiPS:zxyoiPS:zxyoi不是天津oieroieroier。 思路: 一般位運算都

2018.10.11SDOI2017洛谷P3705BZOJ4819新生的舞會DinkelBach法解法

解析: 這裡只討論這道題中DinkelBachDinkelBachDinkelBach迭代法的好處,題目解析請參考上面的連結。 這道題不管是DinkelBachDinkelBachDinkelBach還是二分都能過,但是DinkelBachDinkelBac

2018.11.09NOIP2016洛谷P1600天天愛跑步樹上差分

傳送門 解析: 據說這是NOIP歷年最難一道題。。但是真的沒有寶藏難啊我覺得。。。 思路: 答案分兩類統計,一種是子樹中過來,一種是其他地方過來。那麼路徑就被拆分成兩部分了,一部分是S−&gt;lcaS-&gt;lcaS−>lca,一部分

uoj#275. 清華集訓2016組合數問題數位dp

傳送門 假設有\(k|{n\choose m}\),因為\(n!\)中質因子\(k\)的次數為\(S(n)=\left\lfloor\frac{n}{k}\right\rfloor+\left\lfloor\frac{n}{k^2}\right\rfloor+...\),而\(m!\)和\((n-m)!\)

數據結構之順序表Java語言描述

arraylist 表數據 nbsp real 不同 1.5 根據 長度 tar   之前總結過使用C語言描述的順序表數據結構。在C語言類庫中沒有為我們提供順序表的數據結構,因此我們需要自己手寫,詳細的有關順序表的數據結構描述和C語言代碼請見【我的這篇文章】。   在Jav

BZOJ1458洛谷4311士兵占領網絡流

scrip AR truct gis lin class ++i () 網絡 【BZOJ1458】【洛谷4311】士兵占領(網絡流) 題面 BZOJ權限題,洛谷真好 Description 有一個M * N的棋盤,有的格子是障礙。現在你要選擇一些格子來放置一些士兵,一個格子

BZOJ2084洛谷P3501[POI2010]ANT-AntisymmetryManache算法

異或操作 image font bzoj rdquo 技術 sign ant close 題意描述   原題:        一句話描述:對於一個0/1序列,求出其中異或意義下回文的子串數量。 題解   我們可以看出,這個其實是一個對於異或意義下的回文子串數

HTML+CSS+JavaScript實現待辦事項純DOM實現

todolist ive relative spa java set 釣魚 scrip input 需求:實現待辦事項 <!DOCTYPE html> <html lang="en"> <head> <meta chars

CodeForces 129 BStudents and Shoelaces拓撲排序

end owin clu namespace 每次 font order 單獨 when Anna and Maria are in charge of the math club for junior students. When the club gathers tog

BZOJ4300絕世好二進位制,DP

題意: n<=100000,ai<=2*10^9 思路:按二進位制逐位考慮,只要有至少1位取and後為1就可以接下去 設dp[i]為第i位取and之後為1的最長的序列長度,意會一下 1 #include<cstdio> 2 #include<iostream

Spring筆記三Spring中BeanXML方式裝配

       我們可以把 Spring 看作一個大型的工廠,而 Spring 容器中的 Bean 就是該工廠的產品。要想使用這個工廠生產和管理Bean,就需要在配置檔案中告訴它需要哪些 Be

洛谷3648[APIO2014] 序列分割斜率優化DP

點此看題面 大致題意: 你可以對一個序列進行\(k\)次分割,每次得分為兩個塊元素和的乘積,求總得分的最大值。 區間\(DPor\)斜率優化\(DP\) 這題目第一眼看上去感覺很明顯是區間\(DP\)。 但是,一看資料範圍,\(n\le100000\),這是要上天的節奏! 不過,再看\(m\le

Python開發第七篇:面向物件進階篇

上一篇《Python 面向物件(初級篇)》文章介紹了面向物件基本知識: 面向物件是一種程式設計方式,此程式設計方式的實現是基於對 類 和 物件 的使用 類 是一個模板,模板中包裝了多個“函式”供使用(可以講多函式中公用的變數封裝到物件中) 物件,根據模板