日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Codeforces Round #818 (Div. 2)

發布時間:2023/12/14 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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=0k?Cni?

PS:

賽時其實是畫二叉樹找規律找出來的,本來是想貪心的構造一個序列
但是在計算了一下每個葉子節點的權值時發現了經典組合數 13311\quad 3\quad 3\quad 11331
之后粘了個組合數板子就秒了,啟發就是以后可以計算節點地位或者說節點的權值
然后放置編號,那么思路會明確的多

ll n, m, k;namespace cnm {const int FN = 1e5 + 5;ll fac[FN];//階乘數組ll ifc[FN];//階乘逆元ll inv[FN];//逆元void init(int n){fac[0] = fac[1] = ifc[0] = ifc[1] = inv[1] = 1;rep(i, 2, n){fac[i] = fac[i - 1] * i % mod;inv[i] = (mod - mod / i) * inv[mod % i] % mod;ifc[i] = ifc[i - 1] * inv[i] % mod;}}ll A(ll n, ll m){ return fac[n] * ifc[n - m] % mod; }ll C(ll n, ll m){if (n < m) return 0;return fac[n] * ifc[m] % mod * ifc[n - m] % mod;}ll lucas(ll n,ll m)//當n,m超過1e5,mod比較小時{if (n < mod && m < mod) return C(n, m);return (C(n % mod, m % mod) * lucas(n / mod, m / mod)) % mod;} } using cnm::C; using cnm::A; using cnm::lucas; using cnm::fac; using cnm::ifc; using cnm::inv;void solve() {cin >> n >> k;if (k >= n) cout << ksm(2ll, n, mod) << endl;else{cnm::init(n);ll ans = 0;rep(i, 0, k) ans = (ans + C(n, i)) % mod;cout << ans << endl;} }

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) (lognlognlogngcdgcdgcd的復雜度)
但如果我們枚舉 ddd,再枚舉 n?cn-cn?c (n?cn-cn?cddd的倍數)
我們的復雜度就降為 O((nloglogn)logn)O((nloglogn)logn)O((nloglogn)logn)
(lognlognlogngcdgcdgcd的復雜度,nloglognnloglognnloglogn為埃氏篩的復雜度)
特別要注意的是 a<n?ca<n-ca<n?c 所以 ddd 取不到 1
我們直接讓歐拉函數 phi[1]=0phi[1]=0phi[1]=0 即可(本來是等于1的)

ps:

感覺數學題中 lcmlcmlcmgcdgcdgcd 很容易滿足積性函數的性質
之后遇到類似的題目,如果沒有思路,可以猜測是否為積性函數

int n, m, k;bool np[N];//非質數 int p[N], pn;//質數 質數個數 template<typename T> void get_f(int n, T f[]) {f[1] = 0;rep(i, 2, n){if (!np[i]) p[++pn] = i, f[i] = i - 1;rep(j, 1, pn){if (i * p[j] > n) break;np[i * p[j]] = true;if (i % p[j] == 0){f[i * p[j]] = f[i] * p[j];break;}f[i * p[j]] = f[i] * (p[j] - 1);}} }int phi[N];void solve() {cin >> n;get_f(n, phi);ll ans = 0;for (ll d = 1; d < n; d++){for (ll i = 1; i * d < n; i++){ll c = n - i * d;ans += c * d / gcd(c, d) * phi[i] % mod;ans %= mod;}}cout << ans << endl; }

F 大佬說是用網絡流過的,還沒學,留個坑

總結

以上是生活随笔為你收集整理的Codeforces Round #818 (Div. 2)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。