JAVA程序设计:生成乘积数组的方案数(LeetCode:1735)

给你一个二维整数数组 queries ,其中 queries[i] = [ni, ki] 。第 i 个查询 queries[i] 要求构造长度为 ni 、每个元素都是正整数的数组,且满足所有元素的乘积为 ki ,请你找出有多少种可行的方案。由于答案可能会很大,方案数需要对 109 + 7 取余 。

请你返回一个整数数组 answer,满足 answer.length == queries.length ,其中 answer[i]是第 i 个查询的结果。

 

示例 1:

输入:queries = [[2,6],[5,1],[73,660]]
输出:[4,1,50734910]
解释:每个查询之间彼此独立。
[2,6]:总共有 4 种方案得到长度为 2 且乘积为 6 的数组:[1,6],[2,3],[3,2],[6,1]。
[5,1]:总共有 1 种方案得到长度为 5 且乘积为 1 的数组:[1,1,1,1,1]。
[73,660]:总共有 1050734917 种方案得到长度为 73 且乘积为 660 的数组。1050734917 对 109 + 7 取余得到 50734910 。
示例 2 :

输入:queries = [[1,1],[2,2],[3,3],[4,4],[5,5]]
输出:[1,2,3,10,5]

思路:本题参考零神的解法,具体过程不再赘述了,零神解释的很清楚啦。

class Solution {

    private static long[][] c;
    private static int maxn = 10015;
    private static int mod = 1000000007;

    public int[] waysToFillArray(int[][] queries) {
        init();
        int m = queries.length;
        int[] ans = new int[m];
        for (int i = 0; i < m; i++) {
            int n = queries[i][0];
            int k = queries[i][1];
            long sum = 1;
            for (int j = 2; j * j <= k; j++) {
                if (k % j == 0) {
                    int num = 0;
                    while (k % j == 0) {
                        num++;
                        k /= j;
                    }
                    sum = sum * c[n + num - 1][num] % mod;
                }
            }
            if (k != 1)
                sum = sum * n % mod;
            ans[i] = (int) sum;
        }
        return ans;
    }

    private void init() {
        c = new long[maxn][15];
        for (int i = 0; i < maxn; i++)
            c[i][0] = 1;
        for (int i = 1; i < maxn; i++)
            for (int j = 1; j <= i && j <= 13; j++)
                c[i][j] = (c[i - 1][j] + c[i - 1][j - 1]) % mod;
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值