4513: [Sdoi2016]儲能表 數位DP
阿新 • • 發佈:2018-05-04
sca mod \n eterm pre stat img eof 取模
國際慣例的題面:
聽說這題的正解是找什麽規律,數位DP是暴力......
好的,我就寫暴力了QAQ。
我們令f[i][la][lb][lc]表示二進制從高到低考慮位數為i(最低位為1),是否頂n上界,是否頂m上界,是否頂k下界的數字和,g[i][la][lb][lc]表示(同上定義)的數字個數。
轉移的話,先計算出這一位n,m,k的限制,然後枚舉這一位第一個數和第二個數填什麽,判定xor和是否滿足k的條件,轉移即可。
記憶化搜索實現較為簡單。
註意最後計算答案的時候,方案數乘以k可能爆long long,所以k要先取模。
代碼:
(就算我WA了,TLE了,代碼寫的像屎一樣,也不include<iostream>!pair真好用。)
1 #include<cstdio> 2 #include<algorithm> 3 #include<cstring> 4 typedef long long int lli; 5 const int maxn=1e2+1e1; 6 7 lli f[maxn][2][2][2],g[maxn][2][2][2]; // f is sum , g is count . 8 int ba[maxn],bb[maxn],bc[maxn],mod; 9 10 inline void dfs(int bit,int la,int lb,intView Codelc) { // bit is the bit that we are determining in range [1,64] . 11 if( ~f[bit][la][lb][lc] ) return; 12 if( !bit ) { 13 f[bit][la][lb][lc] = 0 , g[bit][la][lb][lc] = 1; 14 return; 15 } int lima = !la || ba[bit] , limb = !lb || bb[bit] , limc = lc && bc[bit]; 16 f[bit][la][lb][lc] = g[bit][la][lb][lc] = 0; 17 for(int i=0;i<=lima;i++) for(int j=0;j<=limb;j++) if( ( i ^ j ) >= limc ) { 18 int ta = la&&i==lima , tb = lb&&j==limb , tc = lc&&(i^j)==limc; 19 dfs(bit-1,ta,tb,tc); 20 g[bit][la][lb][lc] = ( g[bit][la][lb][lc] + g[bit-1][ta][tb][tc] ) % mod , 21 f[bit][la][lb][lc] = ( f[bit][la][lb][lc] + f[bit-1][ta][tb][tc] + ( (lli) ( i ^ j ) << ( bit - 1 ) ) % mod * g[bit-1][ta][tb][tc] % mod ) % mod; 22 } 23 } 24 25 inline int cutbit(lli t,int* dst) { 26 int ret = 0; memset(dst,0,sizeof(int)*maxn); 27 while(t) dst[++ret] = t & 1 , t >>= 1; 28 return ret; 29 } 30 31 int main() { 32 static int T,mx; 33 static lli n,m,k,ans; 34 scanf("%d",&T); 35 while(T--) { 36 scanf("%lld%lld%lld%d",&n,&m,&k,&mod) , --n , --m , memset(f,-1,sizeof(f)) , memset(g,0,sizeof(g)) , mx = std::max( cutbit(k,bc) , std::max( cutbit(n,ba) , cutbit(m,bb) ) ) , 37 dfs(mx,1,1,1) , ans = (f[mx][1][1][1]-g[mx][1][1][1]*(k%mod)%mod+mod)%mod , printf("%lld\n",ans); 38 } 39 return 0; 40 }
く遠く続いてる 空
遙遠地 遙遠地 無盡延伸的天空
その向こうで 君は 何想う
彼方的你 現在正想些什麽
いつか消える あの星の下
在那顆終會隕落的星星下
永遠(とわ)を願い 想い見上げ
翹首仰望著 祈求著永恒
強く弱く光を放つ
燦爛的 黯淡的 明滅閃耀的星光
君の近くに 北鬥七星
在你身邊的 北鬥七星
そんな 輝きであるように
我想像它一樣照耀著你
君を想い 願い掛けて
思念著你 許下了願望
4513: [Sdoi2016]儲能表 數位DP