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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

test2 3-16 2021 模拟赛two

發(fā)布時間:2023/12/3 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 test2 3-16 2021 模拟赛two 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

文章目錄

  • 考試復(fù)盤
  • 染色問題
  • 芬威克樹
  • 禮物

考試復(fù)盤

先說T1T1T1

染色,以為是道數(shù)學(xué)題,推了有一會兒的公式,從顏色1到顏色m,感覺是dpdpdp轉(zhuǎn)移

發(fā)現(xiàn)顏色重疊的方案可以轉(zhuǎn)化為另外一種相鄰不重疊的染色

但是推到顏色4的時候就發(fā)現(xiàn)自己考慮掉了一些情況

最后得出應(yīng)該是做不出來了

往后做了,又跑回來敲暴力,半天發(fā)現(xiàn)自己暴力敲出來都很困難


再說T2T2T2

推了整整一張的lowbitlowbitlowbit發(fā)現(xiàn)了某些跟kkk進(jìn)制和取模kkk的一些性質(zhì)吧

先把暴力敲了

然后推廣n≤1e9n\le 1e9n1e9,然后就卡住了

半路轉(zhuǎn)回去看暴力,發(fā)現(xiàn)自己對樹狀數(shù)組找的規(guī)律出現(xiàn)了偏差——打表發(fā)現(xiàn)的,倉促改了

才勉強(qiáng)保住了202020的暴力

對于40%40\%40%的部分分也有想過放到樹上,將iiii+lowbit[i]i+lowbit[i]i+lowbit[i]連邊,然后線段樹維護(hù)一下

哎!應(yīng)該再認(rèn)真細(xì)想一下下,就發(fā)現(xiàn)其實是非常好維護(hù)的啊!白丟202020

當(dāng)時莽正解去了


最后說T3T3T3

我真的很討厭很不會這種環(huán)旋轉(zhuǎn)同構(gòu)的題,啊啊啊啊啊啊啊啊

剛看到環(huán)就打算破環(huán)為鏈嘛,畢竟是老套路

然后旋轉(zhuǎn)同構(gòu),就想到了昨天做的第三題,zjx大佬講得減去前一個出現(xiàn)的位置處理

考慮將寶石的位置相減,然后sortsortsort位置差,判斷重構(gòu)

但是很快發(fā)現(xiàn)自己無法破環(huán)為鏈處理n?1n-1n?1這兩個寶石的銜接

導(dǎo)致暴力也敲不出來

只能拿m=0m=0m=0n≤4n\le 4n4暴力打表的分

萬萬沒想到這種旋轉(zhuǎn)等價類就是polyapolyapolya應(yīng)用老套路!!

俺哪知道polyapolyapolya??寒假期間lj講過,但是當(dāng)時就沒學(xué)懂

這次我認(rèn)了——害,今天要把polyapolyapolya補(bǔ)一下!!


總結(jié)一下

這一場的考試單不提難度問題,畢竟沒有人知道下一場是簡單還是難到摳jio

但就自己考試心態(tài)以及策略上的反思

第一次通讀了三道題后,很明顯感受到自己對T1,T3T1,T3T1,T3的方案數(shù)求解之類問題,尤其是T1T1T1完全做不來

就花了挺多的時間搞T2T2T2,最后還是呈現(xiàn)的暴力

T1,T3T1,T3T1,T3之間多次反復(fù)橫跳,敲暴力,敲了又刪又改,再敲……

完全沒有冷靜下來想想如何敲暴力,以及自己是否能敲出來,還有暴力的正確性

  • 評估題目難度后,若覺得絕對無果,就弄暴力
  • 暴力更要思考一些細(xì)節(jié),評估自己能否敲出來,以及驗證暴力的正確性。確定🆗后再動手敲
  • 選擇自己最有可能淦出來的題,根據(jù)自己能力分配時間,啃死了做不出來的題就不要回去看了,絕對不能再出現(xiàn)反復(fù)橫跳不斷切換思路,整個人沒有靜下來的情況!!!
  • 就算沒有一道題能拿更多的暴力分,也要想盡辦法拿基礎(chǔ)的暴力分,并且不要看不起4/54/54/5分,不氣餒,不妥協(xié),不慌張,盡可能多拿每一分
  • 考試時間長,后半部分更要打起精神,切忌出現(xiàn)后面走神分心,今天就出現(xiàn)了兩三次,一定要迅速拉回來
  • 以自己的水平來看,能完整淦出一道題的幾率小之又小,所以應(yīng)該一點點蠶食,從少到多,從小到大一點點把部分分慢慢拿走,最后獲得一個可觀的部分分總和
  • 總而言之,今天的考試反思就是當(dāng)做一道題的時候就認(rèn)認(rèn)真真專注地啃,不要在此期間去想其他的題目。不要在題目間反復(fù)橫跳,一會兒做這個,一會兒做那個,除非靈光乍現(xiàn),當(dāng)然我一般是不可能的。

    今天暴露出來的知識問題

  • dpdpdp果然還是自己比較薄弱的板塊
  • 與環(huán)有關(guān)的題目
  • 統(tǒng)計方案數(shù)——一般都跟數(shù)學(xué)掛鉤的題目
  • FFT,NTTFFT,NTTFFT,NTT的應(yīng)用還是不太行啊
  • polyapolyapolya定理
  • 好像很多的樣子……
  • 抓緊時間孑孓!!!今晚至少要把polyapolyapolya重新學(xué)懂


    染色問題

    目前只會50%50\%50%的部分分

    不考慮先前染的顏色被覆蓋這件事情

    如果某種顏色在最終的序列中出現(xiàn)了xxx次,就直接認(rèn)為在染這種顏色的時候,只染了xxx個格子

    但這樣一來每次染色的格子就不再是連續(xù)的一段了

    巧妙的把給一段格子染色認(rèn)為是在已被染色的顏色序列中插入一段

    設(shè)fi,jf_{i,j}fi,j?表示前iii次染色,已有顏色序列長度為jjj的方案數(shù)

    則有轉(zhuǎn)移 想了很久,是晚上去逛操場走圈圈時想懂的

    fi,j=fi?1,j+∑k=0j?1fi?1,k×(k+1)f_{i,j}=f_{i-1,j}+\sum_{k=0}^{j-1}f_{i-1,k}\times (k+1)fi,j?=fi?1,j?+k=0j?1?fi?1,k?×(k+1)

  • iii顏色染完后被覆蓋,相當(dāng)于沒染過,fi?1,jf_{i-1,j}fi?1,j?
  • 枚舉iii顏色染得長度j?kj-kj?k,因為不能出現(xiàn)大顏色中間夾雜小顏色的不合法情況(2,1,2)(2,1,2)(2,1,2),所以當(dāng)?shù)?span id="ozvdkddzhkzd" class="katex--inline">iii顏色插入的時候,一定是(…,i,i,…,i,i…..)(…,i,i,…,i,i…..)(,i,i,,i,i..) 第一個iii前面的長度可能為[0,k][0,k][0,k],剩下的就是最后一個iii后面的,所以是×(k+1)\times (k+1)×(k+1)
  • 最后一次染色的長度必須非000fm,jf_{m,j}fm,j?不能從fm?1,jf_{m-1,j}fm?1,j?轉(zhuǎn)移過來,ififif一下就行了,答案即為fm,nf_{m,n}fm,n?

    芬威克樹

    直接翻譯代碼可得202020,√

    n,q≤2e5n,q\le 2e5n,q2e5404040

    考慮將每個點xxxx+lowbit(x)x+lowbit(x)x+lowbit(x)連邊,如果后者超過了nnn就改為連向一個超級根

    這樣樹狀數(shù)組就變成了一棵有根樹

    而一次修改操作是把一個點到根路徑上的每個點的權(quán)值異或上vvv,查詢是單點查詢權(quán)值

    隨便樹狀數(shù)組或者線段樹維護(hù)dfndfndfn序即可做到

    kkk為奇數(shù) √

    在這個情況連出來的樹,跳lowbitlowbitlowbit操作的本質(zhì)相當(dāng)于xxx的最低非零位不斷×2\times 2×2并進(jìn)位

    發(fā)現(xiàn)在kkk是奇數(shù)的時候,xxx的最低非零位永遠(yuǎn)不會變,因為2x≠0modk2x≠ 0\ mod \ k2x?=0?mod?k對于任何一個小于kkkxxx都成立,同理在模意義下222的逆元也一定存在,所以每個xxx都只會有只多一個后繼

    發(fā)現(xiàn)連出來的這棵樹一定是根節(jié)點分叉的若干條鏈,而每次操作都是給鏈的一段后綴異或上vvv

    所以對于每條鏈用個數(shù)據(jù)結(jié)構(gòu)維護(hù)一下即可,類似前綴和

    kkk為偶數(shù), 此時不能保證[1,n][1,n][1,n]的所有點被連成若干條鏈

    但將kkk拆分為2p×t,t2^p\times t,t2p×t,t為奇數(shù)

    所有滿足最低非零位上的值包含的222的因子個數(shù)不小于ppp的點會連成若干條鏈

    接下來只需要考慮剩下的點

    考慮每暴力走一步最低非零位值包含的222的因子個數(shù)就會+1+1+1

    那么在最低位不變的情況下最壞只需要暴力走ppp次(modkmod\ kmod?k不會使222的因子個數(shù)減少)

    當(dāng)然可能走著走著發(fā)現(xiàn)最低非零位乘222變成000了,這時候最低非零位就發(fā)生了改變

    不過這樣的改變至多只有logknlog_knlogk?n

    所以一次暴力往上走的復(fù)雜度就是O(plogkn)=O(log2klogkn)=O(log2n)O(plog_kn) =O(log_2klog_kn) =O(log_2n)O(plogk?n)=O(log2?klogk?n)=O(log2?n)

    n≤1e9n\le 1e9n1e9

    大下標(biāo)可以動態(tài)開點線段樹

    現(xiàn)在的思路是對于一個點xxx,如果在鏈上,標(biāo)記只打在這個點上就返回,查詢用前綴和

    如果不在鏈上,在支鏈上,以后或許會有升級到鏈上的問題,就暴力更新跳上去

    如果想要ACACAC

    最后只剩下如何定位一個點xxx在哪一條鏈上,鏈頭的位置

    #include <cstdio> #include <iostream> using namespace std; #if(__cplusplus == 201103L) #include <unordered_map> #include <unordered_set> #else #include <tr1/unordered_map> #include <tr1/unordered_set> namespace std {using std :: tr1 :: unordered_map;using std :: tr1 :: unordered_set; } #endif #define maxn 2000005 #define Base 30 struct node {int l, r, ans;node(){ l = r = ans = 0; } }tree[maxn * 30]; unordered_map < int, int > mp; int n, Q, k, p, t, cnt; int mi[Base + 5]; int f[maxn][Base + 5], g[maxn][Base + 5], F[maxn][Base + 5], C[maxn][Base + 5];int lowbit_id( int x ) {if( k == 2 ) return x;while( x % k == 0 ) x /= k;return x % k; }int lowbit_val( int x ) {if( k == 2 ) return x & ( -x );int num = 1;while( x % k == 0 ) x /= k, num *= k;return ( x % k ) * num; }int GetP( int x ) {int num = 0;while( ! ( x & 1 ) ) x >>= 1, num ++;return num; }int GetC( int x ) {int num = 0, w = 1;while( x % k == 0 ) x /= k;x /= k;while( x ) {num += w * ( x % k );x /= k;w *= k;}return num; }void init() {mi[0] = 1;for( int i = 1;i <= Base;i ++ ) mi[i] = mi[i - 1] << 1;p = GetP( k ), t = k / mi[p];for( int i = 1;i < t;i ++ ) {f[i][0] = ( i + i ) % t, F[f[i][0]][0] = i;g[i][0] = ( i + i > t ), C[f[i][0]][0] = g[i][0];}for( int j = 1;j <= Base;j ++ ) {for( int i = 1;i < t;i ++ ) {f[i][j] = f[f[i][j - 1]][j - 1], F[f[i][j]][j] = i;g[i][j] = g[f[i][j - 1]][j - 1] + g[i][j - 1], C[f[i][j]][j] = g[i][j];}} }void modify( int &num, int l, int r, int pos, int val ) {if( ! num ) num = ++ cnt;tree[num].ans ^= val;if( l == r ) return;int mid = ( l + r ) >> 1;if( pos <= mid ) modify( tree[num].l, l, mid, pos, val );else modify( tree[num].r, mid + 1, r, pos, val ); }int query( int num, int l, int r, int L, int R ) {if( ! num ) return 0;if( L <= l && r <= R ) return tree[num].ans;int mid = ( l + r ) >> 1, ans = 0;if( L <= mid ) ans ^= query( tree[num].l, l, mid, L, R );if( mid < R ) ans ^= query( tree[num].r, mid + 1, r, L, R );return ans; }pair < int, int > find( int x ) {int c = GetC( x ), now = lowbit_id( x ), nxt = 0;now /= mi[p];for( int i = Base;~ i;i -- ) {if( C[now][i] <= c ) {c -= C[now][i];now = F[now][i];nxt += ( 1 << i );}}now *= mi[p];while( x % k == 0 ) x /= k, now *= k;return make_pair( now, nxt ); }int calc( int x ) {if( GetP( lowbit_id( x ) ) < p ) {if( mp.count( x ) ) return mp[x];else return 0;}pair < int, int > top = find( x );if( mp.count( top.first ) ) return query( mp[top.first], 0, 1e9, 0, top.second );else return 0; }void insert( int x, int val ) {while( x <= n && GetP( lowbit_id( x ) ) < p ) {if( mp.count( x ) ) mp[x] ^= val;else mp[x] = val;x += lowbit_val( x );}if( x <= n ) {pair < int, int > top = find( x );int rt;if( mp.count( top.first ) ) rt = mp[top.first];else rt = mp[top.first] = ++ cnt;modify( rt, 0, 1e9, top.second, val );} }int query( int x ) {int ans = 0;for( int i = x;i;i -= lowbit_val( i ) )ans ^= calc( i );return ans; }int main() {scanf( "%d %d %d", &n, &Q, &k );init();while( Q -- ) {int opt, x, y;scanf( "%d %d", &opt, &x );if( opt == 1 ) {scanf( "%d", &y );insert( x, y );}else printf( "%d\n", query( x ) );}return 0; }

    禮物

    循環(huán)同構(gòu)套polyapolyapolya,答案為

    ∑d∣gcd(n,m)f(nd,md)?(d)n\frac{\sum_{d|gcd(n,m)}f(\frac{n}ozvdkddzhkzd,\frac{m}ozvdkddzhkzd)\phi(d)}{n}ndgcd(n,m)?f(dn?,dm?)?(d)?

    f(n,m)f(n,m)f(n,m)表示將nnn個珠子中的mmm個變成金的,且最長連續(xù)段不超過kkk,首尾連續(xù)段長度之和也不超過kkk的方案數(shù)

    考慮未變金的剩下n?mn-mn?m個珠子,因為是環(huán)所以有n?mn-mn?m個間隙

    相當(dāng)于要在n?m?1n-m-1n?m?1個間隙以及首尾處(特殊的一個間隙單獨處理)中放入mmm個金珠子

    類似將連續(xù)段的金珠子縮成一個點的思想

    很容易寫出生成函數(shù),每一個間隙(除掉首尾特殊判斷)的可能為∑i=0kxi\sum_{i=0}^k x^ii=0k?xi

    首尾的生成函數(shù)為∑i=0k(i+1)xi\sum_{i=0}^k(i+1)x^ii=0k?(i+1)xi

    F(x)=(∑i=0kxi)n?m?1?(∑i=0k(i+1)xi)F(x)=(\sum_{i=0}^kx^i)^{n-m-1}·(\sum_{i=0}^k(i+1)x^i)F(x)=(i=0k?xi)n?m?1?(i=0k?(i+1)xi)

    答案為[xm]F(x)[x^m]F(x)[xm]F(x)

    如果停在這里,暴力多項式乘法以及前綴和優(yōu)化就是O(n2)O(n^2)O(n2)

    接下來是正解的處理

    G(x)=∑i=0k(i+1)xiG(x)=\sum_{i=0}^k(i+1)x^iG(x)=i=0k?(i+1)xi

    xG(x)+∑i=0k+1xi=G(x)+(k+2)xk+1xG(x)+\sum_{i=0}^{k+1}x^i=G(x)+(k+2)x^{k+1}xG(x)+i=0k+1?xi=G(x)+(k+2)xk+1

    解得G(x)=1+(k+1)xk+2?(k+2)xk+1(1?x)2G(x)=\frac{1+(k+1)x^{k+2}-(k+2)x^{k+1}}{(1-x)^2}G(x)=(1?x)21+(k+1)xk+2?(k+2)xk+1?

    代回F(x)F(x)F(x)

    F(x)=(∑i=0kxi)n?m?1?1+(k+1)xk+2?(k+2)xk+1(1?x)2F(x)=(\sum_{i=0}^kx^i)^{n-m-1}·\frac{1+(k+1)x^{k+2}-(k+2)x^{k+1}}{(1-x)^2}F(x)=(i=0k?xi)n?m?1?(1?x)21+(k+1)xk+2?(k+2)xk+1?=(∑i=0kxi)n?m?1(1?x)2?(1+(k+1)xk+2?(k+2)xk+1)=\frac{(\sum_{i=0}^kx^i)^{n-m-1}}{(1-x)^2}·(1+(k+1)x^{k+2}-(k+2)x^{k+1})=(1?x)2(i=0k?xi)n?m?1??(1+(k+1)xk+2?(k+2)xk+1)

    由等比數(shù)列求和公式得∑i=0kxi=1?xk+11?x\sum_{i=0}^kx^i=\frac{1-x^{k+1}}{1-x}i=0k?xi=1?x1?xk+1?F(x)F(x)F(x)繼續(xù)等價于
    (1?xk+1)n?m?1(1?x)n?m?1×(1?x)2?(1+(k+1)xk+2?(k+2)xk+1)\frac{(1-x^{k+1})^{n-m-1}}{(1-x)^{n-m-1}\times (1-x)^2}·(1+(k+1)x^{k+2}-(k+2)x^{k+1})(1?x)n?m?1×(1?x)2(1?xk+1)n?m?1??(1+(k+1)xk+2?(k+2)xk+1)=(1?xk+1)n?m?1(1?x)n?m+1?(1+(k+1)xk+2?(k+2)xk+1)=\frac{(1-x^{k+1})^{n-m-1}}{(1-x)^{n-m+1}}·(1+(k+1)x^{k+2}-(k+2)x^{k+1})=(1?x)n?m+1(1?xk+1)n?m?1??(1+(k+1)xk+2?(k+2)xk+1)

    (1?xk+1)n?m?1(1-x^{k+1})^{n-m-1}(1?xk+1)n?m?1用二項式定理展開變成∑i=0n?m?1Cn?m?1i(?xk+1)i\sum_{i=0}^{n-m-1} C_{n-m-1}^{i}(-x^{k+1})^ii=0n?m?1?Cn?m?1i?(?xk+1)i

    1(1?x)n?m+1=(1?x)?(n?m+1)\frac{1}{(1-x)^{n-m+1}}=(1-x)^{-(n-m+1)}(1?x)n?m+11?=(1?x)?(n?m+1)用廣義二項式定理展開變成∑r=0∞Cn?m+1rxr\sum_{r=0}^{∞}C_{n-m+1}^{r}x^rr=0?Cn?m+1r?xr

    第三部分是三個單項式的和,考慮拆開計算,只需要枚舉第一部分xxx的指數(shù)

    #include <cstdio> #include <cmath> using namespace std; #define int long long #define mod 998244353 #define maxn 1000005 int T, n, m, k, cnt; int fac[maxn], inv[maxn], phi[maxn], prime[maxn]; bool vis[maxn];int qkpow( int x, int y ) {int ans = 1;while( y ) {if( y & 1 ) ans = ans * x % mod;x = x * x % mod;y >>= 1;}return ans; }void init( int n ) {fac[0] = inv[0] = 1;for( int i = 1;i <= maxn;i ++ ) fac[i] = fac[i - 1] * i % mod;inv[maxn] = qkpow( fac[maxn], mod - 2 );for( int i = maxn - 1;i;i -- ) inv[i] = inv[i + 1] * ( i + 1 ) % mod; }int C( int n, int m ) {return fac[n] * inv[m] % mod * inv[n - m] % mod; }void sieve( int n ) {phi[1] = 1;for( int i = 2;i <= n;i ++ ) {if( ! vis[i] ) prime[++ cnt] = i, phi[i] = i - 1;for( int j = 1;j <= cnt && i * prime[j] <= n;j ++ ) {vis[i * prime[j]] = 1;if( i % prime[j] == 0 ) {phi[i * prime[j]] = phi[i] * prime[j];break;}elsephi[i * prime[j]] = phi[i] * ( prime[j] - 1 );}} }int gcd( int x, int y ) {if( ! y ) return x;else return gcd( y, x % y ); }int F( int n, int m ) {int ans1 = 0, ans2 = 0, ans3 = 0;for( int i = 0;i * ( k + 1 ) <= m;i ++ ) {int x = i & 1 ? mod - C( n - m - 1, i ) : C( n - m - 1, i );int j = i * ( k + 1 );ans1 = ( ans1 + x * C( n - j, m - j ) % mod ) % mod;if( j + k + 2 <= m ) ans2 = ( ans2 + x * C( n - j - k - 2, m - j - k - 2 ) % mod ) % mod;if( j + k + 1 <= m ) ans3 = ( ans3 + x * C( n - j - k - 1, m - j - k - 1 ) % mod ) % mod; }return ( ans1 + ans2 * ( k + 1 ) % mod - ans3 * ( k + 2 ) % mod + mod ) % mod; }signed main() {scanf( "%lld", &T );init( maxn - 5 );sieve( maxn - 5 );while( T -- ) {scanf( "%lld %lld %lld", &n, &m, &k );int d = gcd( n, m ), ans = 0, sqt = sqrt( d );for( int i = 1;i <= sqt;i ++ ) {if( d % i == 0 ) {ans = ( ans + F( n / i, m / i ) * phi[i] % mod ) % mod;if( d / i != i ) ans = ( ans + F( n / ( d / i ), m / ( d / i ) ) * phi[d / i] % mod ) % mod;}}printf( "%lld\n", ans * qkpow( n, mod - 2 ) % mod );}return 0; }

    總結(jié)

    以上是生活随笔為你收集整理的test2 3-16 2021 模拟赛two的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。