[AcWing 870] 约数个数

image

复杂度 O(n)

总体复杂度 100×2×1094.5×106


点击查看代码
#include<iostream>
#include<unordered_map>

using namespace std;
typedef long long LL;
const int N = 110, mod = 1e9 + 7;
unordered_map<int, int> primes;

void solve(int x)
{
    for (int i = 2; i <= x / i; i ++) {
        while (x % i == 0) {
            x /= i;
            primes[i] ++;
        }
    }
    if (x > 1)  primes[x] ++;
}
int main()
{
    int n;
    cin >> n;
    while (n --) {
        int x;
        cin >> x;
        solve(x);
    }
    LL res = 1;
    for (auto prime : primes)   res = res * (prime.second + 1) % mod;
    cout << res << endl;
    return 0;
}

  1. 约数个数的公式推导
    ① 由唯一分解定理可知,任何一个大于 1 的自然数 N,如果 N 不为质数,都可以唯一分解成有限个质数的乘积 N=P1α1P2α2Pnαn,这里 P1<P2<<Pn 均为质数,指数 αi 是正数;
    ② 任何一个质数也可以写成 N=P1α1P2α2Pnαn 的形式,只需让 Pn=N,αn=1,α1=α2==αn1=0
    ③ 由 ① ② 可知对任何一个大于 1 的自然数 N,都可以用 N=P1α1P2α2Pnαn 表示,其中 P1<P2<<Pn 均为质数,指数 αi 是非负数;(指数可以为 0 );
    ④ 约数个数 M=(α1+1)(α2+1)(αn+1),证明如下:因为对于 N 的任意一个约数 d ,都有 d=P1β1P2β2Pnβn,每一组 β1 ~ βn 的组合对应一个约数,组合的个数等于约数的个数,故 N 的约数个数等于 α1 ~ αi 组合个数,对于每一个 Pi,指数可以取的值有 0 ~ αi,共 αi+1 个,故约数个数 M=(α1+1)(α2+1)(αn+1)
  2. primes 的 key 是 Pi,value 是 αi,返回迭代器中的 first 代表的是 Pi,second 代表的是 αi
  3. int 范围内的整数,约数个数最大为 1536;
posted @   wKingYu  阅读(103)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
欢迎阅读『[AcWing 870] 约数个数』
点击右上角即可分享
微信分享提示