题解:P9838 挑战 NPC IV
题面
总优美度
记权重
观察 f
因为
所以满足
层数
所以有
k=1
我们有一个很显然的贪心:把大的
设前缀权重和函数
则
其中
计算 sum(p)
设
关键性质
最小总优美度对应的排列数至少为
因为固定层后,第
最小总优美度对应的排列数只会多不会少。
代入计算,发现
所以
其中
因此
约为
最小总优美度对应的排列数已经超过
因为有 dfs(_1,_2,_3,_4,_5,s) 为各层还剩
优化
- 因为同一层内部的数互相交换不影响层分配方案。第
i 层有cnt_i 个数,内部排列数为cnt_i! 。所以可以先把k 除以cnt_i! 。 - 记忆化。
实现
::::info[如果你学会就补药打开]
#include <bits/stdc++.h> using namespace std; #define int long long #define void int #define sqrt __lg #define freopen memset #define break continue #define while for #define cin(x) scanf("%lld",&x) #define cout(x) printf("%lld\n",x) #define max(x) sizeof(x) #define enum goto #define switch if #define exit return #define fill constexpr #define jia + #define jianfa - #define cheng * #define chu / #define jian % #define xiaoyu < #define dayu > #define dengyu == #define budengyu != #define xiaodeng <= #define dadeng >= #define qie && #define huo || #define fei ! #define anwei & #define huoyu | #define yihuo ^ #define qufan ~ #define zuoyi << #define youyi >> #define fuzhi = #define jiafuzhi += #define jianfuzhi -= #define chengfuzhi *= #define chufuzhi /= #define quyufuzhi %= #define zeng ++ #define jianjian -- fill int a=1e2+10; fill int b=7e3+10; fill int c=60; fill int d=998244353; fill int e=1e18; fill int f=(d+1)>>1; fill int g=166374059; fill double h=1e-8; int i,j,k,l,m,n,o[c],p,q[16][9][5][3][2][b]; void s(int u){ int v=u chu 2,w=u anwei 1; v quyufuzhi d; int x=v cheng ((v jia 1) jian d) jian d cheng f jian d; int y=v cheng ((v jia 1) jian d) jian d cheng ((2 cheng v jian d jia 1) jian d) jian d cheng g jian d; int z=((i jia 1) jian d cheng x jian d jianfa y jia d) jian d cheng 2 jian d; switch(w) z=(z jia (v jia 1) jian d cheng ((i jian d jianfa v jia d) jian d) jian d) jian d; exit z; } void t(int aa,int ab,int ac,int ad,int ae,int af){ switch(aa xiaoyu 0 huo ab xiaoyu 0 huo ac xiaoyu 0 huo ad xiaoyu 0 huo ae xiaoyu 0 huo af xiaoyu 0)exit 0; switch(fei af)exit fei (aa huo ab huo ac huo ad huo ae); int &ag=q[aa][ab][ac][ad][ae][af]; switch(qufan ag)exit ag; ag=0; int ah=aa jia ab jia ac jia ad jia ae; ah chengfuzhi (i jianfa ah jia 1); ag jiafuzhi t(aa jianfa 1,ab,ac,ad,ae,af jianfa ah); ag jiafuzhi t(aa,ab jianfa 1,ac,ad,ae,af jianfa 2 cheng ah); ag jiafuzhi t(aa,ab,ac jianfa 1,ad,ae,af jianfa 3 cheng ah); ag jiafuzhi t(aa,ab,ac,ad jianfa 1,ae,af jianfa 4 cheng ah); ag jiafuzhi t(aa,ab,ac,ad,ae jianfa 1,af jianfa 5 cheng ah); exit ag; } int r[a]; signed main(){ cin(p); r[0]=1; while(int ai=1;ai xiaoyu 16;zeng ai)r[ai]=r[ai jianfa 1] cheng ai; while(int aj=1;aj xiaodeng p;zeng aj){ cin(i),cin(l); int ak=sqrt(i) jia 1; freopen(o,0,max(o)); while(int al=1;al xiaodeng ak;zeng al)o[al]=i chu (1ll zuoyi al jianfa 1) jianfa i chu (1ll zuoyi al); m=0; while(int am=ak,an=1,ao;am dadeng 1;jianjian am,an=ao jia 1)ao=an jia o[am] jianfa 1,m=(m jia (s(ao) jianfa s(an jianfa 1) jia d) jian d cheng am jian d) jian d; switch(i dayu 29){cout(m);break;} while(int ap=1;ap xiaodeng 5;zeng ap)l=(l jia r[o[ap]] jianfa 1) chu r[o[ap]]; freopen(q,jianfa 1,max(q)); while(int aq=m;;zeng aq){ int ar=t(o[1],o[2],o[3],o[4],o[5],aq); switch(ar dadeng l){cout(aq jian d);enum zz;} l jianfuzhi ar; } zz:; } exit 0; }
::::