第二场模拟。
20+50+50
第一题失误:
1、不定方程没有判无解情况。
2、10^14级别的两个数相乘没有注意到会爆long long。
第二题打的是暴力,考完之后冷静下来发现正解,思路不够开阔吧。
第三题思路错误,打了一个错误的方法,奈何数据垃圾,居然没有爆零。
T1
题目大意:
给出a,b,c三个正整数,求ax+by=c的非负数解的个数。
题解:
用拓展欧几里得求不定方程的最小解就可以了。
T2
题目大意:
给出变量a,c,k,m,n
执行以下语句:
z=[(z*a+c)/k]%mo
if (z<m/2) return 0;else return 1;
执行n次得到一个01串。
现在给出目标01串,求[0,m]内可行的z的个数。
题解:
暴力是O(n*m)的,我们考虑优化。
我们发现复杂度主要集中在模拟执行语句上。
发现如果知道当前的z是什么,接下来生成的01串是固定的,这显然是可以预处理的。
预处理的方法的倍增。
设数组f[i][j],表示数i在执行了2^j次语句后得到的数字。
快速比对是否吻合目标串,用哈希。
维护数组g[i][j],表示数i执行了2^j次语句之后输出的01串的哈希值。
用倍增数组维护暴力跳的过程即可。
T3
题目大意:
给出一个DAG,一个点可以选择当且仅当它所有可以到达的点均没有被选,求最多选择的点数。
题解:
求最大独立集。
最大独立集=最小链覆盖。
最小链覆盖=点数-最大匹配。
首先我们Floyd处理每个点的可达点。
DAG转二分图,假设有一条x-->y的边,x拆成x1和x2,y拆成y1和y2,x1向y2连边就行了。
至于为什么答案就是点数减去最大匹配,简单说明以下。
考虑匹配的意义,每次匹配成功说明某两条边变成一条了,所以这是对的哦!