T1 随机游走1
Description:
你在数轴原点x=0处,每次移动可以向左或者向右移动1距离。比如当前的坐标为x=a,移动一次后可以到达 x=a-1/x=a+1中的一个。
数轴上两点 x=a,x=b 的距离定义为abs(a-b)。
初始你在x=0处,请你计算随机移动 n 次之后距离原点的期望。
输出答案乘以2^n的值,mod 998244353。
solution:
设f[i][j]表示走i步,位于坐标j时的概率。(1<=i<=n,-n <= j <= n)
转移:f[i][j] = 1/2 * f[i - 1][j - 1] + 1/2 * f[i-1][j + 1]
时间复杂度是O(N^2)
我们考虑直接f[n]j,如果走到j号点,设向右走了x步,向左走了y步,那么x + y = n , x - y = j。可以解出y = (n-j)/2并且(n - j) % 2 == 0 ,那么向左走的步数就求出来了。从0走到j相当于从n步中选择y步向左走,剩下的步数向右走,方案数为 C(n, (n - j) / 2)。
预处理阶乘的逆元直接求。
T2 整数拆分
Description:
给定 N,求将 N 划分成不同整数的方案数,对 1e9+7 取模
例如n = 4, 则有2种合法方案:{1+3}, {4};n=7,有5种合法方案:{1+2+4}, {1+6}, {2+5}, {3+4}, {7}。
Solution:
方法1:设f[i][j]表示用1~i去凑j的方案数。转移考虑有i还是没有i,如果方案中有i,答案为f[i-1][j-i];如果没有i,答案为f[i-1][j]
方法2:设f[i][j]表示将j拆成i个数的和。考虑这i个数中有1还是没1,如果有1,就将所有数减一,方案数为f[i-1][j-i],如果没1,还是将所有数减去1,方案数为
f[i][j-i]。因为是拆成i个不同的数,所以i的最大值是O(sqrt(n))级别的,复杂度为O(n sqrt n)。
T3互质的数
Description:
给一个整数区间[L,R]和1个整数x,请问区间中有多少个数与x互质,即求:
(sumlimits_{i=L}^R[gcd(i,x)==1])
Solution:
算法1:
前11个质数的乘积就大于1e10了,所以我们可以考虑容斥。设S_i为与x有公同质因数i的集合,容斥一下就解决了。复杂度为O(T*(sqrt(n) + 2 ^ 11))
算法2:
还是考虑容斥,只不过是用莫比乌斯函数。
直接分解质因数,暴力计算(mu[i]),复杂度不太对,但是可以过。因为数据比较水,x的约数个数太少.
复杂度(O(T* sqrt{nx}))
T4 导弹拦截2(mis)
Description:
给长度分别为N,M的序列a[1…N]和b[1…M],求他们的最长公共严格下降子序列长度,并输出方案,若有多解输出序列在b中下标字典序最小的。
Solution:
设f[i][j]表示以a[i]结尾的LDIS的最长长度。转移有两种:
1.a[i] == b[j] f[i][j] = f[k][j-1] + 1(1<=k<i)
2.a[i] != b[j] f[i][j] = f[i][j-1]
考虑优化: