文章連接:http://www.cnblogs.com/Asm-Definer/p/4434601.html
php
題目連接:http://pan.baidu.com/s/1mgxIKlihtml
官方數據:http://pan.baidu.com/s/1qW4wkVE
git
看巨神們都去虐ZJOI了,蒟蒻只能默默地碼着CQOI的題解……網絡
CQOI的難度分佈也是挺神奇的,五小時五道題,三(或四)道水題一兩道神題(只是對我來講比較神...),我猜讓我去考我必定會寫不完D題而後滾去備戰高考= =ide
從區間[L, H]中選出N個數(能夠重複),求取出的N個數的最大公約數剛好爲K的方案數。函數
其中$1 \leq L, H, N \leq 10^9, H - L \leq 10^5$
ui
剛開始還覺得這是道簡單的莫比烏斯反演題,推了半天公式,發現是個依賴$\lfloor H / K \rfloor $的式子
spa$$\sum_{d=1}^{H/K} \mu(d) (\frac{H}{d*K} - \frac{L-1}{d*K})^N$$(因爲LaTeX打取整式太不方便因此這個式子沒有考慮細節)當$H/K$很大的時候mu就沒法預處理了。.net
後來衡中的JSX同窗(http://55242.cf/)告訴我一個不錯的思路:對較小的mu用線性篩預處理,對較大的mu直接暴力分解質因數。而當d比較大的時候會有不少$(\frac{H}{d*K} - \frac{L-1}{d*K})$爲0的區間,遇到這些區間就跳轉一下就能夠了。粘一下他的核心代碼:設計
1 for( int i = 1;i <= R;++ i) {
2 if((R/i) == (L/i)) {
3 i = min((LL)R/(R/i) ,(LL)L / i ? L/(L/i) : INF);
4 continue;
5 } else {
6 ans += (LL)quickpow((R/i)-(L/i),N) * get_mu(i);
7 ans %= mod;
8 }
9 }思路簡單,效率也很不錯。
不過……有強迫症的同窗可能會想……若是這道題表達式的後半部分不是$(\frac{H}{d*K} - \frac{L-1}{d*K})$而只有$\frac{H}{d*K}$,這個式子就不會很快變成0了。這樣仍是否可作呢?
考慮到在取整後$\frac{H}{d*K}$的取值只有$\sqrt{\frac{H}{K}}$個,若是咱們能快速地求出莫比烏斯的前綴和(梅騰斯函數),就能夠在$O(1)$的時間內求出一段相等的區間的貢獻了。
這個$M(N) = \sum_{i=1}^N \mu(i)$看起來彷佛很難的樣子……其實咱們能夠這樣轉化:
$$M(N)= \sum_{i=1}^N (\sum_{d|i}\mu(d) - \sum_{d|i \land d \neq i}\mu(d) ) \\ = 1 - \sum_{i=1}^N \sum_{d|i \land d \neq i} \mu(d) \\= 1 - \sum_{i'=2}^N \sum_{d=1}^{\lfloor \frac{N}{i'} \rfloor} \mu(d) \\ = 1 - \sum_{i'=2}^N M(\lfloor \frac{N}{i'}\rfloor)$$
這樣,咱們就只需在預處理出前$10^7$項梅騰斯函數後在處理較大的N時對
$\lfloor \frac{N}{i'}\rfloor$分塊遞歸就能夠快速地求出超過$10^7$的梅騰斯函數了。(這個帶下取整的遞推式複雜度到底是多少呢……反正我不會分析……不過目測咱們須要計算梅騰斯函數的次數很是少,因此這個複雜度已經足夠了。
然而……出題人表示咱們都太Simple啦,Sometimes Naive!咱們觀察一下題目中的條件……「$H - L \leq 10^5$"......注意到當N個數不全相同的時候,它們的最大公約數必定不會超過其中任意兩個不一樣數的差。因而……咱們只須要將邊界除以K後遞推」N個數不全相同且最大公因數爲i($i \leq 10^5$)"的方案數,最後特判一下N個數都相同的狀況,加上遞歸獲得的F(1)就是答案了,複雜度是優美的$(H-L) log (H-L)$。
在一個無向網絡的最短路徑構成的DAG上求最大流。$|V| \leq 500, |E| \leq 100000 $
彷佛不須要分析了,除了最短路+網絡流外沒有什麼其餘的東西……
注意到這裏的原圖是個稠密圖,使用$O(|V|^2)$的Dijkstra 能夠獲得很好的運行效率。
給出n個區間,每一個區間有一個權值$P_i$;共m次詢問,每次詢問覆蓋$x_i$點的全部區間中權值最小的$K_i$個區間的權值和。數據規模 $\leq 10^5$
很經典的可持久化線段樹的模型。對全部權值離散化後在全部點構造可持久化線段樹,詢問時對線段樹作區間查詢。
已知整數$n, t, a_k(1 \leq k \leq n), m,$ 求出能使$$\sum_{k=0}^n a_k x^k = \sum_{k=1}^n b_k (x-t)^k $$的b數列的第m項。
其中 $a_k$知足遞推式:$$k = 0時,a_k = 1;k > 0時,a_k = (1234*a_{k-1} + 5678) \mod 3389$$.
其中 $0 < n \leq 10^{3000}, 0 \leq t \leq 10000, 0 \leq n-m \leq 5.$
天哪……爲什麼這位出題人這麼喜歡加這麼奇怪的數據範圍限制……
首先,對於多項式來講,這個x的取值是任意的。因此咱們能夠用x+t替換x代入條件,獲得
$$\sum_{k=0}^n a_k (x + t)^k = \sum_{k=0}^n b_k x^k$$
$$ \sum_{k=0}^n b_k x^k = \sum_{k=0}^n a_k \sum_{j=0}^k \tbinom{j}{k} x^j t^{k-j} $$
考慮枚舉k-j的值:$$\sum_{k=0}^n b_k x^k=\sum_{i=0}^n \sum_{d=0}^{n-i} a_{i+d} \tbinom{i}{i+d} t^d x^i $$
對齊每一項的係數,獲得:
$$b_m = \sum_{d=0}^{n-m} a_{m+d} \frac{(m+d)! t^d}{m!d!}$$注意到n-m不超過5,咱們能夠先得出$a_m$的值,遞推(n-m)次把答案加起來便可。
考慮到n和m均可以很大,這裏在求$a_m$的值時要用到10-based的矩陣快速冪。
我真的是昨天才知道這個「標識」的「識」應該念zhi(4)……我真是文盲……
思路是輪廓線dp,dp狀態記錄掃描到某個位置時「是否須要鏈接左邊的方格」,「當前已經放下了多少個L」和當前的輪廓。(這裏「輪廓」的含義是有哪些列須要鏈接上方垂下來的豎直線)。因爲任意狀態垂下來的豎直線最多隻有3條,輪廓的狀態數不多(暴力枚舉一下發現只有4090左右),能夠利用離散化減小壓位的數量。
但以我極差的代碼能力實在卡不進1s的時間限制……看了這位神犇的博客以後才知道上述的狀態中「不合法狀態」和「不可能到達的狀態」都不少,因此用記憶化搜索來實現能夠大大縮短枚舉的時間。