首页 > 其他 > 详细

[CF615D] Multipliers - 数论

时间:2021-04-06 14:55:56      阅读:15      评论:0      收藏:0      [点我收藏+]

[CF615D] Multipliers - 数论

Description

给你一个数,输出其所有因数的乘积。对\(10^9+7\)取模。这个数以质因子乘积的形式给出。

Solution

统计出每个因子出现的个数,第 \(i\) 个因子的个数记作 \(q_i\),总的因子数的个数显然是 \(\prod_i (q_i+1)\),于是每个因子最终贡献的幂次为 \(\frac 1 2 q_i tot\)

算幂次时根据欧拉定理,要对 \(10^9 +6\) 取模,但是这里有个除 \(2\) 很讨厌,考虑到 \(q_i\)\(tot\) 中至少由一个能被 \(2\) 整除,这里我们可以先对 \(2(10^9+6)\) 取模,最后暴力除

#include <bits/stdc++.h>
using namespace std;

#define int long long

const int mod = 1e9 + 7;
const int MOD = (1e9 + 6) * 2;

int qpow(int p, int q)
{
    q %= MOD / 2;
    return (q & 1 ? p : 1) * (q ? qpow(p * p % mod, q / 2) : 1) % mod;
}

signed main()
{
    ios::sync_with_stdio(false);

    int n;
    cin >> n;

    map<int, int> mp;
    while (n--)
    {
        int x;
        cin >> x;
        mp[x]++;
    }

    int tot = 1;
    for (auto [val, cnt] : mp)
    {
        tot *= (cnt + 1);
        tot %= MOD;
    }

    int ans = 1;
    for (auto [val, cnt] : mp)
    {
        int q = cnt;
        if (q & 1)
            q = tot / 2 % MOD * q;
        else
            q = q / 2 * (tot % MOD);
        q %= MOD;
        ans *= qpow(val, q);
        ans %= mod;
    }

    cout << ans << endl;
}

[CF615D] Multipliers - 数论

原文:https://www.cnblogs.com/mollnn/p/14621568.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!