You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

求解整数分拆计数函数:最大不同数差值为1的分拆数量

解决正整数分拆的特定计数问题

我来帮你搞定这个问题!首先咱们得先把问题的规则理清楚(结合你给的n=5的例子):我们要找的是把正整数n拆成至少3个正整数之和的分拆,满足两种情况之一:要么分拆里所有数都一样,要么分拆里只有两种不同的数,且这两个数的差是1。

问题分析

先看你给的n=5的例子:

  • 符合条件的分拆是:1+1+1+1+1(全同数)、2+1+1+1(1和2,差1,共4个数)、2+2+1(1和2,差1,共3个数)—— 正好3种,和你说的一致。
  • 3+2这种只有两个数的分拆,因为不满足“至少3个数”的要求,所以不算在内。

解法思路

我们可以把符合条件的分拆分成两类来计算,最后加起来就是总数:

1. 全同数的分拆(A类)

这类分拆要求n能被某个正整数k整除,且拆分后的数的个数t = n/k ≥3(也就是k ≤ n/3)。比如n=5时,只有k=1满足(5/1=5≥3),所以A类有1种。

2. 两种差为1的数组成的分拆(B类)

这类分拆需要找到所有正整数k,使得n可以写成a*k + b*(k+1)的形式,其中:

  • a≥1(至少有一个k)
  • b≥1(至少有一个k+1)
  • a+b≥3(拆分后的数总个数至少3个)

比如n=5,k=1时:

  • a=3,b=1 → 3个1 +1个2,总个数4≥3,符合;
  • a=1,b=2 →1个1 +2个2,总个数3≥3,符合;
    k=2时,a=1,b=1 →总个数2<3,不符合,所以排除。

代码实现

下面是用Python写的函数,直接就能用:

def count_A(n):
    """计算全同数的符合条件的分拆数"""
    count = 0
    # k的范围是1到n//3,因为t = n/k ≥3 → k ≤n/3
    for k in range(1, n // 3 + 1):
        if n % k == 0:
            count += 1
    return count

def count_B(n):
    """计算两种差为1的数组成的符合条件的分拆数"""
    count = 0
    k = 1
    # 最小的情况是a=1,b=1,和为k + (k+1) = 2k+1 ≤n →k最大为(n-1)//2
    while 2 * k + 1 <= n:
        # b的最大值:a≥1 →n - b*(k+1) ≥k →b ≤(n -k)/(k+1)
        max_b = (n - k) // (k + 1)
        for b in range(1, max_b + 1):
            a = (n - b * (k + 1)) // k
            # 验证等式成立,且a≥1,总个数≥3
            if a * k + b * (k + 1) == n and a >= 1 and (a + b) >= 3:
                count += 1
        k += 1
    return count

def valid_partition_count(n):
    """返回符合条件的分拆总数"""
    if n < 3:
        return 0  # 小于3的数没法拆成至少3个正整数之和
    return count_A(n) + count_B(n)

测试验证

测试n=5:

print(valid_partition_count(5))  # 输出3,和例子一致

再测试n=6:

  • A类:k=1(6个1)、k=2(3个2)→2种;
  • B类:k=1时,有4个1+1个22个1+2个2→2种;
  • 总数量2+2=4,调用函数会返回4,结果正确。

内容的提问来源于stack exchange,提问作者Ziv Sdeor

火山引擎 最新活动