【BZOJ4417】: [Shoi2013]超级跳马
生活随笔
收集整理的這篇文章主要介紹了
【BZOJ4417】: [Shoi2013]超级跳马
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
題目鏈接:
傳送。
題解:
矩陣快速冪優(yōu)化DP。
先考慮$nm^2$DP,設(shè)$f_{(i,j)}$表示從$1,1$到$i,j$的方案,顯然這個(gè)方程和奇偶性有關(guān),我們考慮某列的$i$同奇偶性的轉(zhuǎn)移和奇偶性相異的貢獻(xiàn),很容易把剛才的方程變成$nm$的輪換式方程,即$f_{(0/1,j)}$表示偶/奇數(shù)列第$j$行的方案數(shù)。此時(shí)轉(zhuǎn)移方程為$$f_{(i,j)}=f_{(i,j)}+\sum_{x=-1}^{1}f_{(i(xor)1,j+x)}$$
然后考慮如何用矩陣優(yōu)化,畫(huà)圖發(fā)現(xiàn)十字相乘時(shí),如果我們把奇偶分成兩列會(huì)沒(méi)辦法轉(zhuǎn)移,然后考慮十字相乘性質(zhì),我們可以把奇偶兩列轉(zhuǎn)換為一列上的兩段,這樣我們構(gòu)建$(2n)^2$的矩陣,至于遞推矩陣,YY一下即可。
代碼:
#define Troy 10/24/2017#include <bits/stdc++.h>using namespace std;inline int read(){int s=0,k=1;char ch=getchar();while(ch<'0'|ch>'9') ch=='-'?k=-1:0,ch=getchar();while(ch>47&ch<='9') s=s*10+(ch^48),ch=getchar();return s*k; }const int mod=30011;int n,m;struct Matrix{int a[101][101];Matrix(){memset(a,0,sizeof(a));}inline void e1(){for(int i=1;i<=2*n;i++)a[i][i]=1;}inline friend Matrix operator *(Matrix x,Matrix y){Matrix z;for(int i=1;i<=2*n;i++)for(int j=1;j<=2*n;j++)for(int k=1;k<=2*n;k++) z.a[i][j]=(z.a[i][j]+x.a[i][k]*1ll*y.a[k][j])%mod;return z;}inline friend Matrix operator ^(Matrix a,long long b){Matrix ret;ret.e1();while(b){if(b&1) ret=ret*a;a=a*a;b>>=1;}return ret;} };int main(){n=read(),m=read();if(m==1){puts(n==1?"1":"0");return 0;}Matrix ans;ans.a[1+n][1]=1;if(n>1)ans.a[2+n][1]=1;Matrix t;for(int i=1;i<=n;i++){t.a[i][i+n]=1;t.a[i+n][i]=1;t.a[i+n][i+n]=1;if(i-1)t.a[i+n][i+n-1]=1;if(i+1<=n)t.a[i+n][i+n+1]=1;}ans=(t^(m-2))*ans;printf("%d",ans.a[2*n][1]); }
?
轉(zhuǎn)載于:https://www.cnblogs.com/Troywar/p/7724937.html
總結(jié)
以上是生活随笔為你收集整理的【BZOJ4417】: [Shoi2013]超级跳马的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: tomcat 下catalina.out
- 下一篇: 软件工程文档流程图