BZOJ4770 图样

来源:互联网 发布:野蔷薇 戴佩妮 知乎 编辑:程序博客网 时间:2024/04/29 20:49

牛逼的DP,一股TC气息
求期望的话可以先求出所有情况的和再除以情况数
考虑f[i][j]表示i个点每个点的权值都是j位的二进制数,最小生成树的和
一定是最高位为0的和为1的分别的形成生成树,然后两部分之间连一条边
那么枚举i个点里有多少个点最高位是1
g[i][j][k]表示左边i个点,右边j个点,每个数k位,两部分之间所有情况最小边的和
f[i][j]=k=0iCki(2(ik)(j1)f[k][j1]+2k(j1)f[ik][j1]+g[k][ik][j1]+2(i+1)(j1))
这里就只解释一下最后那个2(i+1)(j1),他事实上等于2j12i(j1)
然后考虑求g[i][j][k],那么类似地震后的幻想乡那题,设p[i][j][k][l]表示左边i个点右边j个点,每个点权k位,两部分之间最小边权大于等于l的方案数g[i][j][k]=l=12k1p[i][j][k][l]
那么再考虑求p
枚举左边和右边各有多少个最高位为1的
不考虑边界,比如两边一边最高位全是0一边最高位全是1的话,那么最小边的两个端点一定最高位一样
式子大概长这样:
p[i][j][k][l]=x=0iy=0jCxiCyjp[x][y][k1][l]p[ix][jy][k1][l]
边界特殊处理一下
复杂度n42m
我也不知道那些人是怎么跑过去的,反正我打表
打表程序忘存了-_-就把表贴上了把

#include<iostream>#include<cstring>#include<ctime>#include<cmath>#include<algorithm>#include<iomanip>#include<cstdlib>#include<cstdio>#include<map>#include<bitset>#include<set>#include<stack>#include<vector>#include<queue>using namespace std;#define MAXN 1010#define MAXM 1010#define ll long long#define eps 1e-8#define MOD 1000000007#define INF 1000000000ll biao[MAXN][MAXN]={{},{0,0,0,0,0,0,0,0,0,},{0,129140164,129140165,129140167,129140171,129140179,129140195,129140227,129140291,},{0,193710246,64570084,24213786,236084373,77181450,157515737,140774228,215031499,},{0,225995287,121068906,238102183,203547108,218712265,116264831,99443036,79121964,},{0,112997644,108962016,46788094,36549268,117877184,14509798,100438248,107231500,},{0,185638986,53976556,134689163,96426552,194242540,153639990,120659378,101104631,},{0,221959657,227256424,124881873,171543395,157647025,162557411,23785165,258144187,},{0,110979829,87995657,38609442,206828800,253024756,206227824,141710270,10320181,},{0,55489915,109955160,56272067,231265411,63090854,237048705,171426005,85709662,},{0,27744958,238738659,7008635,102222843,120595225,256801988,235521295,180619543,},{0,143012643,24411822,194556475,215231251,130161896,73648531,208001599,170619964,},{0,71506322,157216049,153352677,156238751,192264872,27770309,226347497,54161031,},{0,164893325,184923874,246796406,52697789,171780083,21983921,223228206,185664220,},{0,82446663,171588386,198224372,24087433,169856546,85584783,15039313,51032118,},{0,41223332,233770283,237290397,226108046,172324917,242546032,177098806,40173324,},{0,149751830,40172257,206855876,234897786,42845559,190284536,34527590,26337201,},{0,204016079,44767891,130125758,198580206,248091586,33588797,142939578,109276637,},{0,102008040,53378114,117153053,140321556,207663118,231585645,18039713,42557731,},{0,180144184,222551860,141542926,124678758,256378666,58621640,169814611,164503795,},{0,219212256,51118260,22017057,107400239,71063488,208194809,141040710,82368253,},{0,238746292,9389787,73404282,197290983,187666354,33421568,243481387,230191654,},{0,248513310,258085441,206092103,175865014,46934405,238338656,34885039,160507772,},{0,253396819,46472091,52427070,10622380,31557757,78236842,121818911,78588165,},{0,126698410,14223592,100655489,4793966,28513326,106020021,130112147,61905360,},{0,192489369,53937637,55392462,243667232,206236595,2350355,2101084,238304638,},{0,96244685,115840796,252931583,12885294,108834416,142226001,41501066,77317254,},{0,48122343,186440092,145791627,175931570,191171533,54681626,171376190,8284899,},{0,24061172,35579780,244199696,219925978,194916377,159910040,18680912,56283054,},{0,141170750,129762427,191545910,85767863,96762108,75032252,68489928,100763661,},{0,199725539,123091219,123096044,64432902,33418232,219199667,205120656,160043295,},{0,99862770,147188326,236754524,80629277,18247771,18374728,15226623,146765106,},{0,179071549,43396121,1036568,86131407,196354204,129359671,55657413,95474816,},{0,89535775,177223515,164355065,176671379,141757722,64001077,97905256,148393376,},{0,44767888,56089100,9744293,28759687,254183618,187978963,48484166,10384133,},{0,151524108,71287253,195783672,235105036,63372602,48706668,248893454,173302144,},{0,204902218,189910711,57376262,237466820,231810127,127325080,116537614,29856382,},{0,231591273,257256954,207490218,200639665,46244374,29857601,109793313,58979680,},{0,115795637,205506176,45896798,234868496,29541064,251294633,256749187,63816439,},{0,57897819,124985457,245728025,115443775,144062289,195058805,171514012,53312683,},{0,28948910,21882968,223817069,76823424,21491759,227107331,131344269,97420818,},{0,143614619,14590716,250142242,217871110,158025913,120380172,59940904,105696964,},{0,71807310,75057742,38795205,80612780,246470934,120257251,3687048,158432457,},{0,165043819,201462147,168744597,172739460,61176618,38568071,97892751,11175058,},{0,82521910,219673862,27383363,66850809,196775038,6183180,92038631,31326683,},{0,170401119,101187108,75392768,51235977,45924565,86039077,51855151,254177214,},{0,85200560,221423464,251701329,91563073,211230946,180879303,101994951,244856176,},{0,171740444,202450882,103638399,9527704,148889553,41207463,141727928,145038853,},{0,215010386,225504065,114480260,68277350,11820640,1248372,121446262,9716295,},{0,236645357,26119321,236275454,147928086,206426334,162743844,101312146,105149937,},{0,118322679,258260157,59715480,13946009,169602037,225439100,30268418,150919282,},};int n,m;int main(){    scanf("%d%d",&n,&m);    printf("%lld\n",biao[n][m]);    return 0;}/**/
0 0
原创粉丝点击