Codeforces Round #818 (Div. 2)
D Madoka and The Corruption Scheme
我們可以將所有的比賽看成有 2n2^n2n 個葉子節點的二叉樹
問題轉換為對每個非葉子結點規定左/右兒子贏,并規定葉子節點編號
使得在修改k個非葉子節點的狀態后最后贏家編號最小
那么我們可以先約定每個非葉子節點的左兒子贏
從根節點到葉子節點經過n條邊
我們規定從當前節點走向左兒子代表一個字符‘L’
另一邊為字符‘R’
那么每個葉子節點代表一個LR序列
如果想要一個葉子節點成為最后贏家,那么我們需要修改所有R的位置
那么代表葉子結點的修改權值為R的數量
如果修改次數為k,那么所有LR序列中R的數量小于等于k的都可以成為最后贏家
LR序列中R的個數為 iii 的有 CniC_n^iCni? 個
那么我們貪心的對修改權值從小到大的放入1到2n2^n2n
答案即為 ∑i=0kCni\sum\limits_{i=0}^{k}C_n^ii=0∑k?Cni?
PS:
賽時其實是畫二叉樹找規律找出來的,本來是想貪心的構造一個序列
但是在計算了一下每個葉子節點的權值時發現了經典組合數 13311\quad 3\quad 3\quad 11331
之后粘了個組合數板子就秒了,啟發就是以后可以計算節點地位或者說節點的權值
然后放置編號,那么思路會明確的多
E Madoka and The Best University
這題賽時沒過,賽后補的
一開始不會歐拉篩,先去學了下歐拉篩
題目是求∑a+b+c=nlcm(c,gcd(a,b))\sum\limits_{a+b+c=n}lcm(c,gcd(a,b))a+b+c=n∑?lcm(c,gcd(a,b))
首先看題解我們知道了 gcd(a,b)=gcd(a,a+b)=gcd(a,n?c)gcd(a,b)=gcd(a,a+b)=gcd(a,n?c)gcd(a,b)=gcd(a,a+b)=gcd(a,n?c)
我們設 gcd(a,n?c)=dgcd(a,n-c)=dgcd(a,n?c)=d,那么 gcd(ad,n?cd)=1gcd(\frac{a}ozvdkddzhkzd,\frac{n-c}ozvdkddzhkzd)=1gcd(da?,dn?c?)=1
因為 a+b=n?ca+b=n-ca+b=n?c,所以 ad<n?cd\frac{a}ozvdkddzhkzd<\frac{n-c}ozvdkddzhkzdda?<dn?c? 并且 ad\frac{a}ozvdkddzhkzdda? 與 n?cd\frac{n-c}ozvdkddzhkzddn?c? 互質
即 ad\frac{a}ozvdkddzhkzdda? 的數量為歐拉函數 ?(n?cd)?(\frac{n-c}ozvdkddzhkzd)?(dn?c?) (歐拉函數定義)
而我們可以 O(n)O(n)O(n) 求出 1 到 n 的歐拉函數 (歐拉篩)
但是如果我們如果枚舉 ccc,再質因數分解 n?cn-cn?c
我們的復雜度為 O(nnlogn)O(n\sqrt n logn)O(nn?logn) (lognlognlogn為gcdgcdgcd的復雜度)
但如果我們枚舉 ddd,再枚舉 n?cn-cn?c (n?cn-cn?c為ddd的倍數)
我們的復雜度就降為 O((nloglogn)logn)O((nloglogn)logn)O((nloglogn)logn)
(lognlognlogn為gcdgcdgcd的復雜度,nloglognnloglognnloglogn為埃氏篩的復雜度)
特別要注意的是 a<n?ca<n-ca<n?c 所以 ddd 取不到 1
我們直接讓歐拉函數 phi[1]=0phi[1]=0phi[1]=0 即可(本來是等于1的)
ps:
感覺數學題中 lcmlcmlcm 和 gcdgcdgcd 很容易滿足積性函數的性質
之后遇到類似的題目,如果沒有思路,可以猜測是否為積性函數
F 大佬說是用網絡流過的,還沒學,留個坑
總結
以上是生活随笔為你收集整理的Codeforces Round #818 (Div. 2)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 我的世界显示服务器领地指令,我的世界服务
- 下一篇: 乐嘉性格色彩学