P4245多项式GCD | 内含题解 | ||
|
Description
定义多项式 \(A(x),B(x)\) 的最大公因式 \(C(x)\) :
- \(A(x)=C(x)\times A_1(x)\) , \(B(x)=C(x)\times B_1(x)\) ,其中多项式 \(A_1(x),B_1(x)\) 的次数分别不超过 \(A(x),B(x)\) ;
- 不存在比 \(C(x)\) 次数更高的多项式满足条件1;
- \(C(x)\) 的最高次项系数为 $1$ 。
给出 \(A(x),B(x)\) ,求 \(C(x)\) 。所有系数均在 \(\bmod 998,244,353\) 意义下运算。
点击查看此题原内容“【题解】2017国庆欢乐大奖赛”
最大公共子串
解法:动规
考点:最长公共子序列、最大连续和
设两个字符串分别为x和y
f[i][j]表示公共子串以x的第i个字符作为结尾,同时以y的第j个字符作为结尾,能够得到的最大权值。
也就是说,x的第i个字符与y的第j个字符相同,才能得到一个公共子串。于是有:
f[i][j]= max{f[i-1][j-1]+value(x[i]) , value(x[i])} 条件x[i]==y[i]
f[i][j]= -inf 条件x[i]!=y[i]
时间复杂的O(n^2)
导航
考点 最短路 最短路上的边
注意,根据题意和样例,本题是实时更新的最短路,也就是走到了i号点,GPS会立即算出i号点到终点的最短路。
三次SPFA
步骤一:我们要找出哪些边位于1号GPS的最短路上,哪些边位于2号GPS的最短路上
解决过程:
1.根据1号GPS的地图信息建立反图,终点到每个点的最短距离dis1[i],然后找出哪些边位于1号GPS的最短路上。
对于边<x,y>,若dis1[x]-dis1[y]=Length[x][y],那么边<x,y>就在1号的最短路上,否则不在
2.同理,根据2号GPS的地图信息反图,终点到每个点的最短距离dis2[i],然后找出哪些边位于2号GPS的最短路上。
对于边<x,y>,若dis2[x]-dis2[y]=Length[x][y],那么边<x,y>就在2号的最短路上,否则不在
步骤二:统计出每条边的抱怨次数,重新构图
我们把GPS抱怨的次数当做边的长度。初始时将原图中每条边的长度Len[]设为0.
枚举原图中的每条边,对于第i条边,若该边不在1号GPS的最短路上,它的长度Len[i]++,
若i号边不在2号GPS的最短路上,它的长度Len[i]++。
也就是说,如果边i同时位于两个GPS的最短路上,则Len[i]==0。如果只位于1个GPS的最短路上,Len[i]=1。否则Len[i]=2。
步骤三:计算抱怨次数最少的路径
在步骤二建立的图上,从起点到终点跑一次最短路,路径的长度便是最少的抱怨次数。
浇花
考点 区间动态规划
类似于括号dp的讨论方式,讨论i的左边,选哪个数字作为区间的起点,更新i的值
dp[i][k]表示从左往右讨论到第i个数字,i的左边有k个数字还未被用过(被当做区间的左起点), 的方案数。
分两种情况讨论:
情况1:i被别人更新(因为i前面的k个数,任选一个为区间起点,都可更新到i):
若a[i]+k==h 则dp[i][k]=dp[i+1][k-1]*k+dp[i+1][k]
说明,条件a[i]+k==h,因为i左边有k个数字还没用过,那么以这k个数字作为区间左起点可以操作k次,每次都可以更新到i,更新k次,恰好就能使a[i]变成h。
现在对于i而言,有两种选择, 使用i或者不使用i。
若用i作为区间右端点,因为i只能当一次区间终点,所以只能从前k个中选一个来与它配对,故有k种方案,k个数中i选了一个,对于i+1它左边就只有k-1个未使用的数了,数量总数为k*dp[i+1][k-1] 。
注意,这里i不能再作为区间的左端点了,这样的话会导致i被多更新一次,高度变成h+1
若不用i作为区间端点,则方案数为dp[i+1][k]
情况2:i作为区间起点去更新别人
若a[i]+k+1=h则dp[i][k]=dp[i+1][k]*(k+1)+dp[i+1][k+1]
说明,因为i前面有k个数未被当做左起点使用,全部操作都只能把a[i]更新到h-1这个高度,那么i号点必须自己作为某区间的左起点更新一次,在更新这个区间的同时把自己的高度也更新1,达到h。
这样,对于下一个数i+1而言,算上i号点,它左侧有k+1个点可选做区间左端点,任选一个选后剩下k个点,状态dp[i+1][k]
若不用i作为区间左端点,则方案数为dp[i+1][k+1]
时间复杂度O(n2),实现时采用记忆化搜索比较方便。
Input Format
第一行一个整数 \(\deg A\) 。
第二行 \(\deg A+1\) 个整数系数按从低次到高次的顺序表示多项式 \(A(x)\) 。
第三行一个整数 \(\deg B\) ;
第四行 \(\deg B+1\) 个整数系数按从低次到高次的顺序表示多项式 \(B(x)\) 。
Output Format
输出一行整数系数按从低次到高次的顺序表示多项式 \(C(x)\) 。
Sample Input 1
5
260 2327 3803 1817 291 126
6
1820 1625 1791 1425 283 100 12
Sample Output 1
332748135 13 332748119 1
Sample Input 2
3
6 11 6 1
3
998244347 11 998244347 1
Sample Output 2
1
Hint
样例1解释
\(A(x)=(3x+4)(7x+1)(6x+5)(x^2+13)\)
\(B(x)=(3x+4)(x+7)(x^2+13)(4x^2+5)\)
\(C(x)=(3x+4)(x^2+13)/3=\frac{52}3+13x+\frac43x^2+x^3\)
样例2解释
\(A(x)=(x+1)(x+2)(x+3)\)
\(B(x)=(x-1)(x-2)(x-3)\)
\(C(x)=1\)
数据范围
对于10%的数据, \(\deg A\leq 10\) , \(\deg B=1\) ;
对于另外10%的数据, \(\deg A\leq 10\) , \(\deg B=2\) ;
对于40%的数据, \(\deg A,\deg B\leq 50\) ;
对于60%的数据, \(\deg A,\deg B\leq 500\) ;
对于100%的数据, $0\leq \deg A,\deg B\leq 4000$ ,系数 \(\in [0, 998244353)\) ,输入保证最高次项系数非零。