牛客网暑期ACM多校训练营(第九场)
??途W(wǎng)暑期ACM多校訓(xùn)練營(第九場)
A. Circulant Matrix
做法:看到下標(biāo) \(xor\) 這種情況就想 \(FWT\),可是半天沒思路,于是放棄了。。其實這個 \(n\) 瘋狂暗示啊。設(shè)未知數(shù)向量為 \(x\),列一下方程組就可以發(fā)現(xiàn)有: \[b[k] = \sum_{i \oplus j= k} a[i]·x[j]\] 做法就顯然了吧,把\(a\)和\(b\)分別\(FWT\),對應(yīng)相除然后反變換即可。表示前天才學(xué)的\(FWT\),就不會使了。。
#include <bits/stdc++.h> #define rep(i,a,b) for(int i=a;i<=b;++i) typedef long long ll; const int mod = 1e9+7; const int N = 262144+10; using namespace std; inline int add(int x,int y) {x+=y;if(x>=mod)x-=mod;return x; } inline int sub(int x,int y) {x-=y;if(x<0)x+=mod;return x; } int n; ll a[N],b[N],inv2; ll q_pow(ll a,ll b) {ll ans=1;while(b) {if(b&1) ans=(ans*a)%mod;a=(a*a)%mod;b>>=1;}return ans; } void FWT_xor(ll a[],int n,int on) {for(int i=1;i<n;i<<=1) {for(int j=0;j<n;j+=(i<<1)) {for(int k=0;k<i;++k) {ll u=a[j+k], t=a[j+k+i];a[j+k]=add(u,t); a[j+k+i]=sub(u,t);if(on==-1) {a[j+k]=(ll)a[j+k]*inv2%mod;a[j+k+i]=(ll)a[j+k+i]*inv2%mod;}}}} } int main() {scanf("%d",&n);inv2 = q_pow(2,mod-2);rep(i,0,n-1) scanf("%lld",&a[i]);rep(i,0,n-1) scanf("%lld",&b[i]);FWT_xor(a,n,1);FWT_xor(b,n,1);rep(i,0,n-1) a[i]=(b[i]*q_pow(a[i],mod-2))%mod;FWT_xor(a,n,-1);rep(i,0,n-1) printf("%lld\n",a[i]);return 0; }E. Music Game
做法:簽到題。\(dp[i]\) 表示前i個位置的答案,轉(zhuǎn)移就有:1)當(dāng)前這一位是 \(0\) 2)當(dāng)前這一位到位置 \(j\) 都是\(1\),位置\(j-1\)是\(0\),直接dp即可。
\[dp[i] = dp[i-1]·(1-p[i]) + i^m·\prod_{j=1}^ip[i] + (i-1)^m·\prod_{j=2}^ip[i]·(1-p[1]) + \sum_{j=3}^i ((i-j+1)^m + dp[j-2])·\prod_{k=j}^i p[k]·(1-p[j-1])\]要注意區(qū)間的概率需要判\(0\),在這卡了好久。
轉(zhuǎn)載于:https://www.cnblogs.com/RRRR-wys/p/9489432.html
總結(jié)
以上是生活随笔為你收集整理的牛客网暑期ACM多校训练营(第九场)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 魅族科技宣布 10 月 27 日开启新品
- 下一篇: 70 年来首位,中国籍物理学家薛其坤获得