携程 质因子个数 100%

题目就是给N个数,把这些数各种组合,可以得到一个新的数,然后新的数的不同质因子个数就是权重,问所有权重之和是多少

看样例:
3个数,1 2 6
1,没有质因子,权重0
2,质因子2,权重1
6,质因子2 3,权重2
1*2,质因子2,权重1
1*6,质因子2 3,权重2
2*6,质因子2 3,权重2
1*2*6,质因子2 3,权重2
所有总的权重为10,输出答案10


分析:
首先肯定要分解质因子,
比如6 9 15 17这4个数
6分解成2*3,我们先看2做的贡献:

6本身一次2,
6*9有一次2,6*15有一次,6*17有一次,
6*9*15有一次,6*9*17有一次,6*15*17有一次
6*9*15*17有一次
综上,一共获得了8个权重

那么看到规律,其实就是从剩下的n-1个数里拿0个来和6匹配,拿1个来和6匹配,拿2个来个6匹配,拿3个和6匹配,得出公式 C(n-1, 0) + C(n-1, 1) + C(n-1, 2) + C(n-1, 3) + ... + C(n-1, n-1) 
上面的公式就是高中数学里的,化简为2^(n-1). 咱们有4个数,就是2^3=8

到这里咱们就可以计算出每个质因子的权重了,看起来分别都是2^(n-1)

but,这里有个坑。比如说6=2*3,9=3*3,当6和9一起匹配的时候,3只会算一次,所以还应该去掉这些重复权重。
6有3,9也有3,那其实就是从没有3这个质因子的数字里去取出来匹配就好了
于是用一个num数组来记录每个质因子出现的次数,权重为2^(n-num[i]-1)


以下是基础代码:
num = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
ans = 0

A = [1,6,2]
n = 3

for a in A:
    if a == 1:  //1不用管了
        continue

    canSplit = 0   //记录它能不能被分解,如果不能被分解,说明它自己就是质数
    for i in range(2, a的根号):

        flag = 0
        while a % i == 0:
            flag = 1
            canSplit = 1
            a = a /i

        if flag:
            ans = ans + (2**(n-1-num[i])) % (1e9+7)
            num[i] = num[i] + 1

    if canSplit == 0:  # 分解不了,他不是1,所以肯定本身就是质数
        ans = ans + (2 ** (n - 1 - num[a])) % (1e9+7)
        num[a] = num[a] + 1


print(ans)


还有两个可以注意的点:
(1)由于没有写数字范围,质因子可以考虑先线性筛法筛出所有质数
(2)2^(num[i]-1)对1e9+7取模,应当使用快速幂



可以帮做题和答疑~私聊呗
#携程笔试##携程##笔经#
全部评论
您好,我不太理解,i不一定为质因子吧
点赞 回复 分享
发布于 2022-03-10 23:55
没看懂.... num数组是怎么维护的呢?
点赞 回复 分享
发布于 2022-03-10 22:25
好厉害的大佬,回文那题也出个题解?
点赞 回复 分享
发布于 2022-03-10 22:06
不愧是ACM选手,哭了
点赞 回复 分享
发布于 2022-03-10 22:06
牛逼啊,这也太厉害了
点赞 回复 分享
发布于 2022-03-10 22:05

相关推荐

评论
16
19
分享

创作者周榜

更多
牛客网
牛客企业服务