tg 9 题解

T1

两个送分点:
\(test1:\)puts("1");即可获得\(10pts\)
\(test2:\)由于所有的取值唯一,所以期望就是\(a^m\),快速幂即可获得\(10pts\)
\(test 1+2\)共获得\(20pts\)
对于\(test 3,4,5:\)此时\(m\in [1,1000]\)
可以使用\(DP\)去维护一下出现各种情况的概率
状态转移方程显然就不写了
时间复杂度\(O(m*mod^2)\)
对于\(test 6,7,8\),\(mod\)仍然是可接受的范围,可以矩阵快速幂求一下概率
但是博主不会写于是进入正解:
首先如果不考虑取模,这个是显然的:
\(E(x)=\frac{{\sum\limits^{n}_{i=1}a[i]}^m}{n^m}\)
于是考虑直接对上边的式子拆开并进行一个类似矩阵快速幂的东西
把余数开桶,然后就有了这个式子:
ans1[t1][i*j%mod]=(ans1[t1][i*j%mod]+ans1[t1^1][i]*ans2[t2][j]%Mod)%Mod;
这个式子的含义就是:
对于余数为i*j%mod的次数,它由模数为\(i\),\(j\)转移而来,状态转移方程如上
于是来回滚动就行了
也算是一个倍增优化了吧?

高深的题解:
第9,10个测试点(标算):利用原根进行转化,则乘法转化为加法,\(f[i][j]\)表示\(i\)次操作后\(x\)取模后等于原根的\(j\)次方的概率.
指数需要对\((mod-1)\)取模.这样转化一下我们发现转移还是矩阵的形式,而且是循环矩阵的形式.
循环矩阵快速幂,复杂度\(O(mod^2*logm)\)
另一种标算:定义\(f[i][j]\)表示i次操作后变成原根的j次方的概率.
求出\(g[i][j]\)表示\(2^i\)次操作后变成原根的j次方的概率.
倍增的思想求出\(f[m][]\)这个数组.也是\(O(mod^2*logm)\)

T2

\(test 1,2\)暴力搜即可,期望\(20pts\)
\(test 3,4\)这一部分是\(n=100,t=1\),给定方程反解自变量考虑高消即可\(40pts\)
\(test5\),数据和所有数据点在时空复杂度上没有较大差异
这一部分的特殊性质和树的结构有关系,其实是放出来正解思路的:
如果一个点在深度上比当前点更深,就会有更大贡献
\(b\)可以用前后缀和计算:
\(suf(i)=\sum\limits^{n}_{j=i+1}a[j],pre(i)=\sum\limits^{i}_{j=1}a[j],\)
\(b[i]=\sum\limits^{n}_{j=i+1}suf[j]+\sum\limits^{i-1}_{j=1}pre[j]\)
然后就是反解\(a\),高斯消元显然不再适用:
考虑t=1的情况.
我们知道\(suf(2)+suf(3)+...+suf(n)\)的值(即\(b[1]\)),知道\(pre(1) + suf(3) + suf(4) +...+suf(n)\)的值(即\(b[2]\)),知道\(pre(1)+pre(2)+suf(4)+...+suf(n)\)的值(即\(b[3]\)),
注意到这些式子有很多项是一样的,考虑作差.可以得到下面的式子:
\(b[2]-b[1]=pre(1)-suf(2),b[3]-b[2]=pre(2)-suf(3).....b[i+1]-b[i]=pre(i)-suf(i+1)\)
这些式子是有实际意义的,考虑从\(b[1]\)变到\(b[2]\)时答案的变化量,变化的就是1和2之间连边的贡献.
同时,记\(SUM=a[1]+a[2]+...+a[n-1]+a[n]\)
显然\(pre(i)+suf(i+1)=SUM\),因此\(pre(i)=SUM-suf(i+1)\),将上面式子中所有\(pre\)换成\(suf\)
我们就知道了
\(SUM-2*suf(2) ,SUM-2*suf(3)...SUM-2*suf(n)\)的取值。
注意我们将n个式子作差之后得到了n-1个等式,实际上是丢弃了一些信息,
只保留了\(b[i]\)之间的相对大小而忽略了\(b[i]\)自身的数值大小.
于是考虑\(b[1]=suf(2)+suf(3)+suf(4)+... +suf(n),\)
我们发现\(suf(2)\)\(suf(n)\)都恰好出现了一次,
而之前得到了\(n-1\)个形如\(SUM-2*suf(i)\)的式子,
将这\(n-1\)个式子相加,\(suf(2),suf(3)...suf(n)\)前面的系数都是2,\(SUM\)的系数为\((n-1)\),
那么把这个式子加上\(2*b[1]\),就得到了\((n-1)*SUM\),
将求得的\(SUM\)代入之前的\(n-1\)个式子可以得到\(suf(2),suf(3),suf(4)......suf(n)\),
差分一下即可得到\(a\)数组.

距离正解一步之遥了:
考虑顺着链的思路继续:
t=0的时候,我们可以先暴力计算出b[1],
然后从b[1]出发开始dfs,由某个点的父亲的b[i]推出这个点的b[i],
变化的是这个点和父亲的连边的贡献,也就是这条边两侧的点的a[i]之和的差值.
t=1的时候,
顺着链上的思路,我们先随便找一个点为根建树,将有边直接相连的两个点的b[i]作差.
设x的父亲为prt[x],以x为根的子树中所有a[i]之和为sum(x),
SUM=a[1]+a[2]+...+a[n-1]+a[n],那么b[x]-b[prt[x]]=(SUM-sum(x))-sum(x).
同链的情况一样,得到n-1个式子,将树根的b[i]也列出式子,可以求出全部a[i]之和,
然后就可以根据之前的式子推出所有的a[i],和链的做法类似,不再赘述.

T3

\(Catalan\space 4\to 1\)

opt==0

这里上下左右自由移动,仅需要考虑上下相等,左右相等
枚举所有的上/右情况,
由于\(step_{up}+step_{rignt}=\frac{n}{2}\),仅需枚举\(step_{up}\)即可反推其它情况
这个时候就是:
\(\sum\limits^{\frac{n}{2}}_{i=0}C^{i}_{n}*C^{i}_{n-i}*C^{\frac{n}{2}-i}_{n-2*i}\)

opt=1

在非负半轴走,其实是经典的\(Catalan\)
就是靠定义解的,通项公式\(\frac{C^{n}_{2*n}}{n+1}\)

opt=2

这里就是经典的计数\(DP\)
那么就是记\(f[j]\)表示走了\(j\)步回到起点
\(j\to i\)的过程中钦定始终在同一个半轴上
那么
\(f[i]=f[j]*Cat_{\frac{i-j}{2}}*4\)
不换半轴就是opt=1,乘4因为4个半轴等价的

opt=3

枚举横向移动了多少步.
然后问题就变成两个相互独立的\(Catalan\)问题
这时就是子任务1和3的结合版,但是还是枚举方向
不枚举又错了,会算重
横向移动i步时方案数为\(C(n,i)*Catalan(i/2)*Catalan((n-i)/2)\)
(为了存在合法解,i必须是偶数),


这里必须先钦定上下左右哪些走哪个方向,然后每个方向是相互独立的,所以每个方向要先钦定一遍
对于\(Catalan\)数列注意枚举步数除以2,钦定正确性的原因就是当前\(j\to i\)再换半轴在后边显然枚举到

T4

显然有\(22pts\)暴力分std::next_permutation
对于正解,可以考虑使用预设性dp
定义\(dp[i][j][k]\)表示考虑到第\(i\)个数,目前有\(j+1\)个最终连续段,\(max\)和为\(k\)的方案数,
有了定义之后就好转移了

posted @ 2022-07-21 21:42  2K22  阅读(67)  评论(0)    收藏  举报