T1:Matrix
小z 的女朋友送给小z 一个n×nn×nn×n的矩阵。但是矩阵实在太大了,小z 的女朋友拿不动,只能带给他两个长度为n 的整数序列l,t,分别作为矩阵F的第一行和第一列(保证 l1=t1l1=t1l1=t1),并且告诉小z 矩阵可以通过如下方式得到:F(i,j)=a∗F(i,j−1)+b∗F(i−1,j)F(i,j)=a∗F(i,j−1)+b∗F(i−1,j)F(i,j)=a∗F(i,j−1)+b∗F(i−1,j)
现在小z 猜到了系数a,b,他想要计算F(n,n)F(n,n)F(n,n)模109+710^9+7109+7的值。
忽然想不起从(0,0)(0,0)(0,0)到(n,m)(n,m)(n,m)的路径数了,数组开小……
对于一个l[i]l[i]l[i],通过大力推式子可以发现一定会乘上an−1∗bn−ia^{n-1}*b^{n-i}an−1∗bn−i
对于t[i]t[i]t[i],则一定会乘上an−i∗bn−1a^{n-i}*b^{n-1}an−i∗bn−1
然后考虑对于每一个值,会对答案造成多少贡献
可以发现,每一个值的贡献次数就是这个位置到(n,n)(n,n)(n,n)的路径数
以该位置为起点,那么就是从(0,0)(0,0)(0,0)到(n−1,n−i)(n-1,n-i)(n−1,n−i),但是第一步是固定的
那么就成了从(0,0)(0,0)(0,0)到(n−1,n−i−1)(n-1,n-i-1)(n−1,n−i−1)
类似蚂蚁路径,方案数为C(2∗n−i−2,n−2)C(2*n-i-2,n-2)C(2∗n−i−2,n−2)即为对答案的贡献次数
T2:pq
小q 的女朋友送给小q n个整数。但是这些数太大了,小q 的女朋友拿不动,于是拜托小q把这些数减少一些。
小q 每次可以选择其中的两个x,y (不能同时选择同一个数) 变成x−P,y−Q,现在他希望能知道最多能帮女朋友减掉多少P,Q。
设f[i][j][k]f[i][j][k]f[i][j][k]表示处理到第iii个数,还有jjj个PPP,kkk个QQQ没处理,存的是已经处理的个数
可以发现,如果PPP的个数为000,那么QQQ的个数的最大值不会超过200020002000
如果QQQ的个数为000,那么PPP的个数的最大值不会超过200020002000
如果都不为零,那么P,QP,QP,Q的个数都不会超过404040
根据这个性质,我们可以暴力把s[i]s[i]s[i]拆成xxx个PPP,yyy个QQQ
分类讨论xxx和jjj,yyy和iii的大小,然后统计答案
但是数组50∗2000∗200050*2000*200050∗2000∗2000会炸,因为每一次只会有i−1i-1i−1对答案造成贡献,可以把i滚动掉
时间效率O(n∗(2000+2000+402)∗50)O(n*(2000+2000+40^2)*50)O(n∗(2000+2000+402)∗50)
T3:graph
小f 的女朋友送给小f 一个有n个点m条边的无向图。但是这个无向图太大了,小f 的女朋友拿不动,于是小f 希望只保留图的一部分。在这张图上,对于第i条边ui,viui,viui,vi,从uiuiui 到vivivi的代价为aiaiai,从vivivi到uiuiui的代价为bibibi。
小f 希望只保留一个包含1号点的有向环(不能有重复的点),使得环上代价之和最小。
因为环中一定有节点111,那么就从1开始大力DFS,数组开够有656565%
那么我们可以把111拆成222个点,暴力枚举环上与111相连的两点,取最小值,效率为O(n3logn)O(n^3 \log n)O(n3logn),252525%
然后考虑优化
我们可以把与111相连的点分成两部分,然后跑最短路,但是有可能最短的两个点在一个集合中,考虑优秀的分组方式
考虑按位分组,可以保证对于任意的Vi!=UiVi!=UiVi!=Ui都一定会有一次分在不同的两组,需要分成(logn)(log n)(logn)组,然后统计最小值即可
时间效率O(nlogn2)O(n \log n^2)O(nlogn2)