【$n$个数约数和】 约数之和

传送门

题意

\(n\)个数,求出他们的乘积的所有约数之和\(mod\; 10^{9}+7\)

数据范围

\(\begin{array}{l}1 \leq n \leq 100 \\ 1 \leq a_{i} \leq 2 * 10^{9}\end{array}\)

题解

同样求出每个质因数的指数,根据乘法分配律

  • \(t=(t\times p + 1) \; mod\; m\)

  • \(p_{b}\)

    • $t=1 $

    • \(t=p+1\)

    • \(t=p^{2} + p +1\)

    • \(\dots\)

    • \(t=p^{b} + p^{b-1} + \dots + p^{0}\)

Code

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define rep(i,a,n) for(int i=a;i<n;i++)
#define per(i,a,n) for(int i=n-1;i>=a;i--)

const int mod=1e9+7;
unordered_map<int,int>primes;

int main()
{
    int n;cin>>n;
    while(n--)
    {
        int x;cin>>x;
        for(int i=2;i<=x/i;i++)
        {
            while(x%i==0)
            {
                x/=i;
                primes[i]++;
            }
        }
        if(x>1) primes[x]++;
    }
    ll ans=1;
    for(auto it:primes)
    {
        ll res=1;
        int p=it.first,mi=it.second;
        ll t=1;
        while(mi--) t=(t*p+1)%mod;   
        ans=(ans*t)%mod;
    }
    cout<<ans<<endl;
}

posted @ 2020-10-22 22:14  Hyx'  阅读(115)  评论(0)    收藏  举报