NOIP2018模拟9.8

第二场模拟。

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连边就行了。

至于为什么答案就是点数减去最大匹配,简单说明以下。

考虑匹配的意义,每次匹配成功说明某两条边变成一条了,所以这是对的哦!

posted @ 2018-09-10 21:27  praying_cqf  阅读(100)  评论(0编辑  收藏  举报