oj113

#113:  某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米。我们可以把马路看成一个数轴,马路的一端在数轴0的位置,另


时间限制:2 sec.  内存限制:128 MB. 

试题描述

某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米。我们可以把马路看成一个数轴,马路的一端在数轴0的位置,另一端在L的位置;数轴上的每个整数点,即0,12,……,L,都种有一棵树。由于马路上有一些区域要用来建地铁。这些区域用它们在数轴上的起始点和终止点表示。已知任一区域的起始点和终止点的坐标都是整数,区域之间可能有重合的部分。现在要把这些区域中的树(包括区域端点处的两棵树)移走。你的任务是计算将这些树都移走后,马路上还有多少棵树。 

输入格式

第一行有两个整数L(1 <= L <= 10000)和 M(1 <= M <= 100),L代表马路的长度,M代表区域的数目,L和M之间用一个空格隔开。接下来的M行每行包含两个不同的整数,用一个空格隔开,表示一个区域的起始点和终止点的坐标。

输出格式

包括一行,这一行只包含一个整数,表示马路上剩余的树的数目。

样例输入
500 3
150 300
100 200
470 471


样例输出
298

其它说明
#include<stdio.h>
int main()
{
    int L,M,t,s,x,i,j;
    while(scanf("%d %d",&L,&M)!=EOF)
    {
        t=0;
        int a[1001]={0};
        for(i=1;i<=M;i++)
        {
            scanf("%d %d",&x,&s);
            for(j=x;j<=s;j++)
            a[j]=1;
        }
        for(i=1;i=L+1;i++)
        if(a[i]=0)t++;
        printf("%d\n",t);
    }
    return 0;

}

 

转载于:https://www.cnblogs.com/1079722822a/p/8016122.html

<think>我们正在讨论XTUOJ(湘潭大学在线评测系统)中的“数码积性”相关问题。 根据用户需求,我们需要介绍数码积性相关的内容,并提供相关问题。 数码积性(Digital Multiplicative)通常与数字的各位数字乘积有关。在数学和编程问题中,常见的数码积性问题包括: 1. 计算一个数的各位数字的乘积。 2. 寻找满足某些条件的数,例如:其各位数字乘积等于某个值,或者具有某种性质(如积性函数)等。 在XTUOJ中,可能包含类似这样的问题: 例如:给定一个区间 [a, b],求在这个区间内有多少个数的各位数字乘积等于某个值,或者满足一定的条件(比如乘积是质数?或者乘积是某个数的倍数?)。 注意:数码积性可能也涉及到数位DP(动态规划)的算法来解决,因为直接遍历区间可能会超时。 下面我们给出一个简单的例子:计算一个正整数n的各位数字的乘积的函数。 例如:n=1234,那么各位数字乘积=1*2*3*4=24。 代码实现(Python): ```python def digit_product(n): product = 1 while n: n, d = divmod(n, 10) if d == 0: # 注意:如果有一位为0,则整个乘积为0 return 0 product *= d return product ``` 但是注意,上述代码中,如果数字中有一位是0,那么乘积就是0,而且一旦遇到0,就可以提前返回0。 在XTUOJ中,可能的问题形式: 题目:求区间 [L, R] 内,各位数字乘积等于 k 的数的个数。 或者:求区间 [L, R] 内,各位数字乘积是质数的数的个数。(注意:乘积为质数,那么乘积只能是一个质数,且这个质数必须是由多位数字相乘得到,但实际上,由于质数只能被1和它本身整除,所以如果这个乘积是质数,那么原数的各位数字只能有一个质数(大于1)和其他若干个1。因为如果有两个大于1的数字,乘积就会是合数。所以,这样的数只能是:除了某一位是一个质数(2,3,5,7)外,其他位都是1。当然,还要注意0不能出现,因为出现0乘积就是0,而0和1都不是质数。) 因此,我们可以设计一个数位DP来解决这类问题。 下面我们给出一个数位DP的框架,用于解决区间内满足各位数字乘积等于k(或者满足其他条件)的数的个数。 但是注意:乘积k的范围可能很大(比如一个100位数,各位数字乘积最大是9^100,这是一个很大的数),所以不能直接作为状态。因此,我们需要对状态进行优化,例如: 1. 将乘积分解质因数,然后用质因数的指数作为状态(如果k给定,那么可能的状态是有限的,因为质因数的指数不会超过位数乘以每个质因数的最大指数)。 2. 或者,如果问题要求乘积等于某个特定的k,且k比较小,那么可以直接用k作为状态。 3. 如果问题要求乘积是质数,那么我们可以利用上述分析的特点(只有一位是非1的质数,其他都是1)来直接构造。 具体问题具体分析,这里我们以“区间[L,R]内各位数字乘积为质数的数的个数”为例: 分析:乘积为质数,设为p,那么p只能等于2,3,5,7(因为一位数字的质数只有这四个)。而且,整个数中只能有一位是大于1的数字(且必须是2,3,5,7之一),其他位都是1。注意:如果这个数有0,那么乘积为0,不可能等于质数,因此不考虑0。 所以,这样的数可以这样构造: 假设这个数有n位,那么它的每一位要么是1,要么是2,3,5,7中的一个,并且只能出现一次非1(且不能出现在首位为0的情况,但因为1和2,3,5,7都不会是0,所以只要注意首位不能是0即可,而题目是正整数,首位自然不为0)。 因此,我们可以这样计算: 对于区间[L,R]内的数,我们可以按位数枚举。 对于每个长度len,我们考虑: 非1的数字可以出现在len个位置中的任意一个(不能是首位为0的情况,但非1数字是2,3,5,7,所以不会出现0,因此每个位置都可以放)。 对于每一个位置,我们分别放入2,3,5,7(四种选择),其余位置都是1。 那么,对于长度为len的数,总共有4*len个数(但要注意,如果这个数有前导0?不,我们构造的数每一位只能是1或者2,3,5,7,所以没有前导0问题,因为1和这些数字都不是0)。 但是,注意:我们构造的数可能位数不足len,比如首位不能是0,所以我们的构造方法实际上已经避免了前导0。 然而,这里有一个问题:我们构造的数可能小于L或者大于R?所以我们需要判断是否在区间内。 因此,我们可以生成所有满足条件的数(因为位数不会太多,比如最大20位,那么总共20*4=80个数,再乘以位数(不同长度)),然后计数。 具体步骤: 1. 枚举位数:从min_len(L的位数)到max_len(R的位数) 2. 对于每个位数len,生成所有满足条件的数:在len个位置中选择一个位置放置非1的数字(2,3,5,7),其他位置放1。 3. 将这个生成的数(字符串)转成整数,判断是否在区间[L,R]内。 注意:如果位数小于当前len,实际上可以通过前导1来补?但我们的构造固定了位数,所以不会少。但是,注意如果len=1,那么数字只能是一位数,那么可以是2,3,5,7(因为一位数时,没有其他位置,所以这个位置只能放2,3,5,7,而1?注意1的乘积是1,但是1不是质数,所以不行)。 因此,对于一位数,只有2,3,5,7满足。 所以,我们可以这样生成所有候选数(注意位数上限,因为R的最大值可能很大,所以如果R的位数很大,那么生成的候选数也会很多吗?实际上,位数最多是R的位数,假设R的位数是d,那么候选数个数为4*d,所以总候选数个数最多4*d_max,而d_max一般不超过100,所以400个候选数,可以直接枚举判断。 因此,我们可以写代码: ```python def count_prime_product_in_range(L, R): # 生成所有满足条件的候选数 candidates = set() # 最大位数 max_len = len(str(R)) # 枚举位数,从1到max_len for length in range(1, max_len+1): # 如果长度为1,则单独考虑 # 生成一个长度为length的数组,初始化为1 # 每个位置都可以替换成2,3,5,7 for pos in range(length): for num in [2,3,5,7]: # 构建一个列表,所有位置都是字符'1' num_list = ['1'] * length # 将pos位置替换成当前数字的字符 num_list[pos] = str(num) # 注意:如果这个数的首位是0?不可能,因为最小是1 s = ''.join(num_list) # 转换成整数 n = int(s) # 注意:有可能有重复?比如当length>1时,如果两个不同位置替换成同一个数字,但整个数可能相同?不会,因为位置不同。 # 但是注意,如果同一个位置替换成不同的数字,那肯定不同;不同位置替换成相同的数字,那么整个数也不同(因为位置不同)。 # 所以不会重复。 candidates.add(n) # 注意:length=1时,我们生成了2,3,5,7,但当length>=2时,我们生成的数都是大于等于11的(因为至少有两个1)。 # 现在,我们还要考虑:当length>=2时,我们生成的数中,如果替换的位置是首位,那么替换后首位是2,3,5,7,这是合法的;如果替换的位置是中间或者末尾,那么生成的数也是合法的,没有前导0。 # 但是,我们生成的可能有重复吗?用set重了。 # 现在,我们对候选数进行筛选:在[L,R]区间内,并且注意:生成的数中,如果位数不足max_len,但是大于等于L小于等于R,就算。 count = 0 for num in candidates: if L <= num <= R: count += 1 return count ``` 然而,上面的方法只适用于区间范围不大的情况?因为如果区间很大,但是候选数最多400个(如果max_len=100,那么400个候选数),所以计算量很小。 但是,上面的方法有一个问题:比如在一个很大的区间,比如[1, 10^100],那么我们要枚举100位,那么候选数有100*4=400个,这是可以接受的。 然而,还有一个问题:我们生成的是每一位都是1,然后替换一个位置为2,3,5,7。但是,注意我们生成的数都是没有0的,而且除了一个位置是2,3,5,7,其他都是1。所以,这个方法正确。 但是,有没有可能一个数有两个非1的数字?按照分析,如果有两个非1的数字,那么乘积就至少是2*2=4,并且是合数(除非这两个非1数字中有一个是1,但1不影响,所以实际上我们要求只能有一个非1的数字)。所以,我们的构造方法不会漏掉任何情况。 注意:还有一种特殊情况,就是一位数,但是一位数只能是2,3,5,7,我们已经包括。 但是,我们构造的数中,比如11,它的乘积是1,不是质数,所以不应该计入。但是注意在我们的构造中,当我们构造两位数时,我们替换一个位置(比如第一个位置替换成2,则得到21;第二个位置替换成2,得到12)这两个数的乘积分别是2和2,都是质数?不对,注意21的乘积是2*1=2,是质数;12的乘积是1*2=2,也是质数。但是,注意:我们要求只能有一个非1的数字吗?不对,在构造中,我们只替换了一个位置,所以其他位置都是1,所以整个数中只有一个非1数字。因此,生成的数都满足:只有一个非1数字,且这个数字是2,3,5,7之一。所以乘积就是2,3,5,7之一,是质数。 但是,注意:我们的构造方法会生成11吗?当我们构造两位数时,如果我们不替换(即两个位置都是1),但是我们没有生成这样的数,因为我们只替换一个位置。所以,不会生成11。所以,我们生成的数都满足乘积为质数。 所以,这个方法正确。 但是,有一种情况:如果这个数有多个非1数字,但乘积仍然是质数?不可能,因为如果有两个大于1的数字,乘积至少为4,且如果乘积是质数,那么只能分解成1和它本身,所以这两个数字必须有一个是1,另一个是质数。所以实际上,只能有一个非1数字(且该数字是质数)。因此,我们的构造方法没有漏解。 因此,我们可以通过生成候选数的方法来解决这个问题。 但是,XTUOJ中的题目可能不是这么简单,可能要求乘积等于一个给定的数,或者乘积是某个数的倍数等等。那么就需要更一般的数位DP方法。 这里再介绍一个更一般的数位DP框架,用于计算区间[L,R]内满足条件的数的个数: ```python # 记忆化搜索 # 状态:pos(当前处理到的位置,从高到低),limit(是否受到上界的限制),zero(是否有前导0),product(当前乘积) # 但是,product可能很大,所以需要优化状态。 # 优化方法: # 1. 如果k给定,那么我们可以用k作为状态,然后当k的某个因子超过时,可以剪枝。 # 2. 或者,我们可以将乘积分解质因数,状态为各个质因数的指数(比如乘积只包含2,3,5,7,那么状态就是(a,b,c,d)表示2^a*3^b*5^c*7^d)。 # 因为a,b,c,d的最大值:假设当前有len位,那么a最大为len*3(因为2^3=8<10,但实际上每一位最大是9,所以2的指数最多为len*3?因为9=3^2,但这里我们单独考虑每个质因数:2,3,5,7),但是5和7的指数最多为len(因为一位最多一个5或7)。所以状态空间为(len+1) * (len*3+1) * (len+1) * (len+1) -> 在len=20的情况下,状态大约是20*60*20*20=480000,可以接受。 # 因此,我们可以设计数位DP的状态为:pos, limit, zero, a, b, c, d (分别表示2,3,5,7的指数) # 然后,我们要求,最后乘积等于k(可能是给定的一个数,或者要求乘积大于0且是某个数的倍数等) # 注意:如果题目要求乘积等于k,那么最后我们要判断状态(a,b,c,d)是否等于k的分解? # 但是,k可能还有其他质因数?那么如果k的质因数包含除了2,3,5,7以外的,那么直接不可能。 # 因此,我们假设k的质因数分解后只有2,3,5,7(或者题目保证如此),那么我们可以这样设计。 # 例如:XTUOJ中某一题要求乘积等于k,且k的范围不大(比如k<=10000),那么我们可以预先分解k,然后要求最后状态等于k的分解。 # 但是,如果我们要求乘积是某个质数(比如我们之前的问题),那么我们可以用这个数位DP,但是状态空间太大,不如直接枚举。 # 因此,数位DP适用于k的分解状态不太多的情况。 # 下面给出一个数位DP的框架代码(用于计算区间内各位数字乘积等于k的数的个数,其中k的质因数分解只有2,3,5,7): # 注意:我们将数字0特殊处理,因为0会使乘积为0,所以如果k>0,那么0不需要考虑。但是如果有0,那么整个乘积就是0,所以如果k不为0,那么不能有0。 # 步骤: # 1. 将区间上限R转换成字符串(或数组),用于数位DP的上限。 # 2. 初始化状态:dp[pos][limit][zero][a][b][c][d],这里状态维度高,用字典存储可能更合适(或者数组下标),但维度固定为4维(a,b,c,d)加上pos和limit,zero。 # 由于状态空间较大,我们使用五维数组(加上pos,所以是五维?实际上pos是一维,limit和zero是两维,然后a,b,c,d是四维,总共七维?这样太大,所以我们可以用记忆化搜索,并且用字典存储状态。 # 但是,为了简化,我们假设a,b,c,d有范围,我们可以设定: # a的范围:0到max_a(max_a=数位长度*3,因为每位最多3个2?实际上,每一位最大为9,所以2的指数最多为3,因此最大指数和为len*3) # 同理,b(3的指数)的范围:0到max_b=len*2(因为9有两个3,其他数字最多一个3,所以最大指数为len*2) # c(5的指数)和d(7的指数)的范围:0到len(因为每一位最多一个5或7) # 状态维度:pos(0..len)* limit(0或1)* zero(0或1)* a(0..max_a)* b(0..max_b)* c(0..len)* d(0..len) # 状态总数:len * 2 * 2 * (max_a+1) * (max_b+1) * (len+1) * (len+1) # 在len=20, max_a=60, max_b=40的情况下,状态数=20*2*2*61*41*21*21≈20*2*2*60*40*20*20=76800000,大约7.68e7,这可能太大,在Python中可能超时或超内存。 # 因此,我们需要根据题目具体条件来优化,或者缩小范围。 # 或者,如果k给定,那么我们可以将状态设计为:乘积的分解等于k的分解(即a,b,c,d必须恰好等于k的分解),那么我们在DP过程中就可以剪枝:如果超过了k的分解,就跳过。 # 这样,状态中a,b,c,d的范围就不会超过k的分解中的指数,因此状态空间大大减小。 # 例如:k=100=2^2*5^2,那么a最大2,b最大0,c最大2,d最大0。这样状态空间就很小。 # 因此,我们可以这样设计: # 在数位DP之前,先分解k(如果k=0,则特殊处理;如果k>0,则分解质因数,并且只考虑2,3,5,7)。 # 然后,状态:pos, limit, zero, a, b, c, d (其中a不超过k中2的指数,b不超过k中3的指数,c不超过k中5的指数,d不超过k中7的指数) # 并且,如果a,b,c,d已经等于k的分解,那么后面的位只能是1(因为再乘就会超过),或者0(但0会导致乘积为0,所以k>0时,后面不能有0,所以只能是1)?注意,后面只能选1,因为选其他大于1的数都会导致乘积超过k。 # 所以,状态空间:pos*2*2*(a_max+1)*(b_max+1)*(c_max+1)*(d_max+1),其中a_max=k中2的指数,b_max=k中3的指数,c_max=k中5的指数,d_max=k中7的指数。 # 因此,如果k的分解中的指数都不大,那么状态空间就不会太大。 # 代码框架如下(假设k>0,且k的质因数分解只有2,3,5,7): def digit_dp(L, R, k): # 特殊情况:k=0,那么只要数包含0即可,这里不讨论。 # 分解k:得到k的2,3,5,7的指数 factors = {2:0, 3:0, 5:0, 7:0} temp = k for p in [2,3,5,7]: while temp % p == 0: factors[p] += 1 temp //= p if temp != 1: # 说明k有大于7的质因数,那么不可能由一位数字乘积得到(因为一位数字最大为9,而9=3^2,所以只能有2,3,5,7),因此答案为0 return 0 max_exp = factors # 最大指数 # 将R转换成字符串 s = str(R) n = len(s) # 记忆化数组:dp[pos][limit][zero][a][b][c][d] = count # 由于维度高,用字典存储 memo = {} def dfs(pos, limit, zero, a, b, c, d): # a: 当前的2的指数,b:3的指数,c:5的指数,d:7的指数 if pos == n: # 当处理完所有位 if zero: # 注意,如果整个数就是0,那么乘积是0,但k>0,所以不合法;但如果有前导零,而前面已经选了非0数字,所以zero在最后应该为0? # 所以,实际上,zero表示的是前导零状态,当我们选完所有数字后,如果zero为True,说明这个数就是0(即整个数都是0)? 但是,我们的数位DP在非前导零状态时,zero为False。 # 因此,我们这里需要的是:整个数不为0,且乘积等于k,也就是a==max_exp[2], b==max_exp[3], c==max_exp[5], d==max_exp[7]? # 但是注意:有可能乘积大于0但是小于k?不,我们要求等于k,所以必须指数都恰好等于max_exp。 # 另外,如果整个数就是0,那么乘积是0,而k>0,所以不合法。 if zero: return 0 if a==max_exp[2] and b==max_exp[3] and c==max_exp[5] and d==max_exp[7]: return 1 else: return 0 # 否则,非0,检查指数 if a==max_exp[2] and b==max_exp[3] and c==max_exp[5] and d==max_exp[7]: return 1 else: return 0 key = (pos, limit, zero, a, b, c, d) if key in memo: return memo[key] ans = 0 up = int(s[pos]) if limit else 9 for digit in range(0, up+1): # digit: 当前位的数字 next_limit = limit and (digit==up) next_zero = zero and (digit==0) if next_zero: # 继续前导0状态 # 那么乘积暂时不变 na, nb, nc, nd = a, b, c, d else: if digit==0: # 但是,如果k>0,那么一旦出现0,乘积就是0,后面无论怎么选都是0,不可能等于k(因为k>0)? 所以可以直接跳过 # 但是,如果k=0,那么我们允许0,但本题k>0,所以跳过 # 所以,digit=0且k>0时,跳过 continue else: # 分解digit # digit可以分解为2,3,5,7的乘积 # 注意:digit为1时,分解后指数均为0 dg = digit ta, tb, tc, td = 0,0,0,0 temp_dg = dg for p in [2,3,5,7]: while temp_dg % p == 0: if p==2: ta+=1 elif p==3: tb+=1 elif p==5: tc+=1 elif p==7: td+=1 temp_dg //= p if temp_dg != 1: # 含有其他质因数?但digit在0-9,所以只可能有2,3,5,7,所以不会出现 pass na, nb, nc, nd = a+ta, b+tb, c+tc, d+td # 如果超过k的分解,则跳过(因为再乘后面的位,只会更大) if na>max_exp[2] or nb>max_exp[3] or nc>max_exp[5] or nd>max_exp[7]: continue ans += dfs(pos+1, next_limit, next_zero, na, nb, nc, nd) memo[key] = ans return ans # 调用dfs count_R = dfs(0, True, True, 0,0,0,0) # 再计算L-1,即[0,L-1]的满足条件的数 # 然后相减得到[L,R]的个数 # 这里省略计算L-1的部分(同理,再写一次数位DP,或者封装成一个函数,参数为上界) # 为了简化,我们假设该数位DP函数可以计算[0, x]的满足条件的数,那么答案=count_R - count_{L-1} count_L_minus = digit_dp_upper(L-1, k) # 注意:这里需要实现一个计算[0, x]的函数 return count_R - count_L_minus # 注意:上述代码只是一个框架,并且没有考虑k=0的情况,而且计算两次数位DP(一次R,一次L-1)。 # 由于时间关系,我们不再展开。 综上所述,XTUOJ中的数码积性问题可以使用上述方法解决。 下面提供相关问题: §§相关问题§§ 1. 什么是数码积性?它在编程竞赛中如何应用? 2. 如何用数位DP解决数码积性问题? 3. 有哪些常见的数码积性函数? 4. 请给出一个XTUOJ中数码积性问题的具体题目描述和解答。 </think>### XTUOJ 数码积性介绍 在XTUOJ(湘潭大学在线评测系统)中,数码积性问题主要涉及**数字各位乘积的特性及其数学性质**。这类问题通常要求分析或计算满足特定数码乘积条件的数字,常见于数位动态规划(数位DP)和数论题目中。核心特征包括: 1. **数码乘积定义** 对于整数 $n$,其数码乘积 $P(n)$ 定义为各位数字的乘积。例如: - $n=1234$ 时,$P(n) = 1 \times 2 \times 3 \times 4 = 24$ - $n=305$ 时,$P(n) = 3 \times 0 \times 5 = 0$(含0则乘积为0) 2. **常见问题类型** - **区间计数问题**:求 $[L,R]$ 内满足 $P(n) = k$ 或 $P(n)$ 有特定性质(如质数、完全平方数)的数字个数。 - **数码积性函数分析**:研究 $P(n)$ 的数学性质(如积性、周期性)。 - **构造性问题**:构造满足 $P(n) \equiv a \pmod{b}$ 的数字。 3. **关键算法:数位DP** 由于直接遍历 $[L,R]$ 效率低(尤其 $R$ 较大时),需采用**数位DP**优化。状态设计通常包括: - 当前处理数位位置 $pos$ - 上限约束标记 $limit$ - 前导零标记 $zero$ - 乘积的质因数分解状态(如 $2^a \cdot 3^b \cdot 5^c \cdot 7^d$)[^1] --- ### 典型问题示例 **题目描述**(XTUOJ风格) 求区间 $[L,R]$ 内满足数码乘积 $P(n)$ 为质数的数字个数。 **要求**:$1 \leq L \leq R \leq 10^{18}$。 #### 数学分析 $P(n)$ 为质数 $\implies$ $n$ 需满足: 1. **无数字 $0$**(否则 $P(n)=0$ 非质数)。 2. **恰有一个非 $1$ 数字**(若有两个 $\geq 2$ 的数字,$P(n)$ 为合数)。 3. 该非 $1$ 数字必须是质数码 $\{2,3,5,7\}$。 因此,$n$ 的构成只能是: - **一位数**:$n \in \{2,3,5,7\}$。 - **多位数**:除某一位是 $\{2,3,5,7\}$ 外,其余位均为 $1$(例如 $12, 21, 113$)。 #### 算法实现 利用**候选数生成法**(因满足条件的数极少): 1. **枚举位数** $len$(从 $\text{len}(L)$ 到 $\text{len}(R)$)。 2. **生成候选数**:对每个 $len$,构造所有长度为 $len$ 且恰有一位是 $\{2,3,5,7\}$、其余位为 $1$ 的数字。 3. **区间筛选**:检查候选数是否 $\in [L,R]$。 ```python def count_prime_product(L, R): candidates = set() max_len = len(str(R)) # 生成所有候选数 for length in range(1, max_len + 1): for pos in range(length): # 非1数字的位置 for d in [2, 3, 5, 7]: # 非1数字的取值 s = '1' * length num_list = list(s) num_list[pos] = str(d) num = int(''.join(num_list)) candidates.add(num) # 统计区间内的候选数 return sum(1 for num in candidates if L <= num <= R) ``` #### 复杂度 - 时间:$O(D \cdot 4)$,其中 $D$ 为 $R$ 的位数(例如 $R \leq 10^{18}$ 时 $D=19$,仅需 $76$ 次生成)。 - 空间:$O(D)$,可忽略。 --- ### 扩展问题类型 1. **乘积等于定值 $k$** 使用数位DP,状态设计为乘积的质因数分解向量 $(a,b,c,d)$ 表示 $2^a \cdot 3^b \cdot 5^c \cdot 7^d$[^1]。 2. **乘积为完全平方数** 转化为:$P(n)$ 的每个质因子指数均为偶数。 3. **乘积模 $m$ 等于 $r$** 状态设计为 $(pos, limit, zero, \text{prod} \mod m)$,其中 $\text{prod}$ 为当前乘积。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值