约数:AcWing 870. 约数个数

#include
using namespace std;

typedef long long LL;
const int N=110,mod=1e9+7;

int main()
{
    int t;
    scanf("%d",&t);
    unordered_map primes;
    while(t--)
    {
        int x;
        scanf("%d",&x);
        for(int i=2;i<=x/i;i++)
        {
            while(x%i==0)
            {
                x/=i;
                primes[i]++;
            }
        }
        if(x>1) primes[x]++;
    }
    LL res=1;
    for(auto p:primes)  res=res*(p.second+1)%mod;
    printf("%lld\n",res);
    return 0;
}

  求约数个数,我们把数字进行质因数分解,然后根据数学知识进行求解。

  题目描述的是,输入多个数字,计算这些数字的乘积的约数的个数,我们对每一个输入的数字进行质因数分解,数学知识可以知道约数的个数等于(每一个质因子的指数+1)的乘积,展开来说就是质因子可以从0次一直增加到质因子当前指数,p^a,指数可以从0一直取到a,有a+1种选择

  使用

unordered_map primes;

来存储我们的质因子和它的幂指数, 循环里面使用的是试除法,把数字进行质因子分解,最后面判断一下数字是否是一个质数(经过多次除法之后),然后该数字更改成了质数,并且次数为1,就再更新一次

  关于上面的容器

  • 无序(多重)映射(unordered_map/unordered_multimap)C++11,与 map/multimap 的区别在于键 (key) 无序,只关心 "键与值的对应关系",使用哈希实现。(oi-wiki)

  需要一边计算一边取模,掌握该数学知识(幂指数加一的乘积),试除法把数字进行质因数分解 

你可能感兴趣的:(算法竞赛,算法,数据结构,约数)