LGR 054 洛谷10月月賽II

2022-04-28 19:51:07 字數 3644 閱讀 1058

luogu

成功咕掉codeforces round #517的後果就是,我\(\mbox\)依舊沒有寫出來。\(\mbox\) 。

\(\mbox\)為\(0\)的乘上\(\mbox\)為\(1\)的就是答案。

因為兩個數異或以後二進位制位\(1\)的個數的奇偶性不會變。

至於計算\(\mbox\),預處理到根號,\(o(1)\)計算即可。

#include#includeusing namespace std;

int gi()

#define ll long long

int n,cnt[65536],sz[2];ll a,b,c,d,x;

int main()

printf("%lld\n",1ll*sz[0]*sz[1]);

return 0;

}

直接列舉公差,然後\(o(n)\)掃一遍即可。

#include#includeusing namespace std;

int gi()

const int n = 20005;

const int mod = 998244353;

void inc(int &x,int y)

int n,a[n],f[n],s[n],ans;

int main()

inc(ans,mod-n);

for (int j=1;j<=n;++j) s[a[j]]=0;

} printf("%d\n",ans);return 0;

}

限制條件是如果乙個數是另乙個數的子集,那麼兩個數不能被放在同乙個盒子裡。

對關係建乙個\(dag\),每個數向自己的所有子集連邊,這樣擁有拓撲關係的兩個數就不能放在一起。答案就是\(dag\)最長鏈長度。

構造方案的話,建立乙個源點跑出到每個點\(i\)的最長路\(f_i\),那麼\(i\)就放到編號為\(f_i\)的盒子裡就行了。

暴力建邊\(3^k\),注意當\(n=2^k\)即\(a_i\)取遍\([0,2^k)\)時,建出這個\(dag\)只需要連\(o(k2^k)\)條邊就行了。如果不滿的話,還是把這\(2^k\)個點都建出來,不存在的點權值設為\(0\),依然按上述做法做即可。

#include#include#includeusing namespace std;

int gi()

const int n = 2e6+5;

int n,k,s,vis[n],f[n];vectorans[21];

int main()\)表示用了前\(i\)對數填了\(j\)個位置的方案數,轉移顯然就是列舉當前這對數填多少個,同時因為位置可以任意選所以還得要乘上乙個組合數。這樣一寫出來就會發現他就是乙個指數生成函式卷積的形式,即\(c_i=\sum_^i\binom ija_jb_\)。

所以對於每個\(x\)大有概\(o(p)\)的數對,每個數對可以用乙個指數生成函式表示,把這\(o(p)\)個生成函式暴力卷起來,就可以得到乙個\(o(n^2p^2)\)的做法。

然後因為每個\([0,p)\)只有\(\lfloor\frac rp\rfloor\)或\(\lfloor\frac rp\rfloor+1\)種不同的選法,所以本質不同的數對只有\(3\)種。我們考慮一下每種數對的生成函式。令\(b=\lfloor\frac rp\rfloor\)。

數對中兩個數都只有\(b\)種選法,考慮計算無限制減去兩個數同時出現的方案:\(a(x)=e^e^-(e^-1)e^-1)=2e^-1\)。其中\(e^\)實際上就是\((e^x)^b\)。

同理有\(b(x)=e^+e^-1,c(x)=2e^-1\)。

假設對於某個\(x\)它三種數對的個數分別是\(u,v,w\),那麼我們就只需要計算\(a^u(x)\times b^v(x)\times c^w(x)\times e^\)就行了。

為什麼還有乙個\(e^\)?因為數列中還可以有\(0\)呀。這一點你有沒有注意到呢?

所以我們先預處理出\(a(x),b(x),c(x)\)的\(p\)次冪,這樣預處理的複雜度可以做到\(o(n^p)\),然後對於每個\(x\)都可以\(o(n^2)\)地計算卷積,總複雜度還是\(o(n^2p)\),可以獲得\(80\)分的好成績。

#include#include#includeusing namespace std;

int gi()

const int mod = 1000000007;

inline void inc(int &x,int y)

inline void dec(int &x,int y)

int fastpow(int a,int b)

return res;

}int n,p,r,b,s,inv[5005],c[505][505],ans;

struct poly

poly operator * (poly b)

}dp[3][5005],zero;

int main()

for (int i=0;i<=n;++i) zero.a[i]=fastpow(b,i);

s=fastpow(r,n);inc(ans,s);dec(ans,fastpow(r-b,n));

for (int i=1;i滿分做法比較玄學。

首先,要求\(a(x)\)的若干次冪其實只要預處理到根號就行了,即預處理\(a(x),a^2(x),a^3(x)...\)以及\(a^(x),a^(x),a^(x)...\)這樣預處理的複雜度可以降到\(o(n^2\sqrt p)\),且對於乙個\(x\)仍可以做到\(o(n^2)\)計算。

然後後本部分仍是複雜度瓶頸?發現對於每個\(x\)答案只與三種數對的個數\(u,v,w\)有關,所以加個記憶化......就能過了?

司說本質不同的數對數量是\(o(\sqrt p)\)的,那......就是吧。

#include#include#include#includeusing namespace std;

int gi()

const int mod = 1000000007;

inline void inc(int &x,int y)

inline void dec(int &x,int y)

int fastpow(int a,int b)

return res;

}int n,p,r,b,sqr,s,inv[5005],c[505][505],ans;

struct poly

poly operator * (poly b)

}dp[3][2][80],zero;

map,int>,int>m;

int calc(int u,int v,int w)

int main()

for (int i=0;i<=n;++i) zero.a[i]=fastpow(b,i);

s=fastpow(r,n);inc(ans,s);dec(ans,fastpow(r-b,n));

for (int i=1;i,int>pr=make_pair(make_pair(u,v),w);

if (m.find(pr)==m.end()) m[pr]=calc(u,v,w);

inc(ans,s);dec(ans,m[pr]);

} printf("%d\n",ans);return 0;

}

LGR 054 洛谷10月月賽II

結論popcnt x y 和popcnt x popcnt y 的奇偶性相同。然後就是popcnt為奇數的乘為偶數的。預處理一下 2 次方以內的popcnt,直接 o 1 算就行。就是求有多少個等差子串行。方程很好寫,f i 表示以 i 結尾的等差子串行個數,f i sum i f j a i a ...

洛谷10月月賽II

這道題考了矩陣旋轉 其實很考驗推公式的能力和 能力 這裡有個小技巧 可以設 x,y 為原點,然後去推公式,然後實際操作中橫座標加上x,縱座標加上y就好了。順時針 i,j j,i 逆時針 i,j j,i include define rep i,a,b for register int i a i b...

LGR 052 洛谷9月月賽II(加賽)

題解 沒打。ab題滿世界都過了應該沒什麼意思 c題是個比較有意思的思維題 先看了題解才會的。我們考慮這麼一件事情 沒鑰匙的人出門後 門一定是開著的 他進來的時候,門一定是開著的 其他時候,一定門能關著比較好 但是這個東西並不是很好維護,因為可能重複算 我們考慮重新排個序 我們把a在b前面的那個排在他...