1294 樱花(化简,阶乘分解)

1. 问题描述:

给定一个整数 n,求有多少正整数数对 (x,y) 满足 1 / x + 1 / y = 1 / n!。

输入格式

一个整数 n。

输出格式

一个整数,表示满足条件的数对数量。答案对 10 ^ 9 + 7 取模。

数据范围

1 ≤ n ≤ 10 ^ 6

输入样例:

2

输出样例:

3
样例解释
共有三个数对 (x,y) 满足条件,分别是 (3,6),(4,4),(6,3)。
来源:https://www.acwing.com/problem/content/description/1296/

2. 思路分析:

对于这种给出数学式子的题目一般都是先要化简一下数学公式,也即需要推导一下看一下有什么性质

因为n!是一个正整数,所以看后面的那个式子即可,相当于问的是有多少个正整数x使得n!n!能够整除x - n!,并且满足下面的关系,若x < n!那么y是负数与题目中x,y都是正整数就矛盾了,所以x > n!,也即x - n! > 0,所以相当于问的是有多少个数字是n!n!的约数,与之前197题阶乘分解的题目是类似的:

最终得到的n!n!约数个数如下图所示,直接使用197题的思路求解即可,在分解n的阶乘的时候计算质因子出现的次数:

3. 代码如下:

from typing import List


class Solution:
    count = 0

    # 线性筛求解2~n之间的质数(包括数字n)
    def init(self, n: int, primes: List[int], st: List[int]):
        for i in range(2, n):
            if st[i] == 0:
                primes[self.count] = i
                self.count += 1
            j = 0
            while primes[j] * i < n:
                st[primes[j] * i] = 1
                if i % primes[j] == 0: break
                j += 1

    def process(self):
        n = int(input())
        primes = [0] * (n + 10)
        st = [0] * (n + 10)
        self.count = 0
        res, mod = 1, 10 ** 9 + 7
        self.init(n + 1, primes, st)
        for i in range(self.count):
            # s为当前质数出现的次数
            p, j, s = primes[i], n, 0
            while j > 0:
                s += j // p
                j //= p
            res = res * (2 * s + 1) % mod
        return res


if __name__ == '__main__':
    print(Solution().process())
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值