BZOJ4770 图样

牛逼的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 1000000000
ll 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;
}

/*

*/
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值