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以内。