2016.11.13【初中部 NOIP普及组 】模拟赛

来源:互联网 发布:tower与其他软件 编辑:程序博客网 时间:2024/06/04 18:56

T3:

比较有意思.

考试没想到.

题目描述:

给个数x(1<=x<=n),让你给询问的m个问题,每个问题分别是1~n里面的某个数是否能被x整除,求出最小的m使得一定可以知道这个数x.

答案=小于等于n的情况下只为一个素数的次方的个数

证明:

我们知道任何除1外正整数可以表示为2^p1*3^p2*5^p3……那么,我们对于任意一个数x,只要询问2^p1,3^p2,5^p3,7^p4,……通过对这些数的询问一定可以通过公倍数得知x是否能被整除。

证毕。


T4:

DP.

但这个dp通过不同的状态设不同的转移方程挺新颖。

题目描述:

用1~n-1的数的和来构造一个在[L..R]区间内的方案数。

可以设如下状态:

f[i,j]表示构成和为i,用j为最大的数的方案数

f[i,j]=f[i,j]+f[i-j,k](1<=k<=min{j-1,i-j})

当然,可以前缀和优化

令s[i,j]表示构成和为i,用j以内的数作为最大数的方案数

f[i,j]=f[i,j]+s[i-j,min(j-1,i-j)]

s[i,j]=s[i,j-1]+f[i,j]


还可以设如下状态

f[i,j]表示用前i个数,构成和为j的方案数。

f[i,j]=f[i-1,j]+f[i-1,j-i]

当然可以滚动,还可以缩成1维

不过需求和j时倒过来,使得每个数只能选1次。

f[j]表示和为j的方案数

f[j]=f[j]+f[j-i]


当然前面的所有状态的复杂度都接近O(n²)


再考虑一种状态

f[i,j]表示选i个数,构成和为j的方案数。

f[i,j]=f[i-1,j-i]+f[i,j-i]

转移的得来自己悟一下,比较巧妙

这个方程是成立的,不信自己推推,

然后这里因为选i个数,很有可能不到n就大于最大的和了,所以i=trunc(sqrt(n))+q

q是一个常数,因为j的不确定,q大概在300以内。

0 0
原创粉丝点击