首页 > 其他 > 详细

约数个数求解(唯一分解定理)(遍历map的写法!)

时间:2020-10-03 23:53:16      阅读:78      评论:0      收藏:0      [点我收藏+]

地址:https://www.acwing.com/problem/content/872/

课程没买的话,应该是看不了的,所以截个图。

技术分享图片

技术分享图片

 唯一分解定理:

技术分享图片

则N的约数个数就为:

技术分享图片

证明:P1^a1的约数个数为a1+1

P2^a2的约数个数为a2+1

.....

根据乘法原理,即为:

(1+a1)*(1+a2)....(1+an)

所以,把每一个乘数拆开来,求出它们的a1,a2....存在map里,最后的时候,套约数个数公式即可。

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e5+50;
const int mod=1000000007;
const int inf=1e9;
int main()
{
    map<int,int>mp;
    int n;
    cin>>n;
    while(n--)
    {
        ll x;
        cin>>x;
        for(int i=2;i<=x/i;i++)
        {
            if(x%i==0)
            {            
                while(x%i==0)
                {
                    mp[i]++;
                    x=x/i;
                }
            }
        }
        if(x>1)
            mp[x]++;    
    }
    ll sum=1;
    for(map<int,int>::iterator it=mp.begin();it!=mp.end();it++)//!!!!!!!!!!!!!!!
    {
        sum=sum*(it->second+1)%mod;
    }
    cout<<sum<<endl;
}

 

约数个数求解(唯一分解定理)(遍历map的写法!)

原文:https://www.cnblogs.com/liyexin/p/13765495.html

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