zoukankan      html  css  js  c++  java
  • 约数个数求解+约数求和(唯一分解定理)(遍历map的写法!)

    地址: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;
    }

     约数求和:

     

     计算公式:

    #include <bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    const int maxn=1e5+50;
    const int mod=1e9+7;
    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++)
        {
            int p=it->first,a=it->second;
            ll md=1;
            ll kk=1;
            while(a--)
            {
                kk*=p;
                kk%=mod;
                md+=kk;    
                md=md%mod;        
            }
            sum=(sum*md)%mod;
        }
        cout<<sum<<endl;
    }
  • 相关阅读:
    Day02
    Day01
    Insecure CAPTCHA (不安全的验证码)
    物理机burp抓虚拟机包
    File Upload(文件上传)
    File Inclusion(文件包含)
    CSRF(跨站请求伪造)
    Command Injection命令注入
    [Unity 2D] Unity CharacterController2D
    [Unity UGUI]卡卡西大法
  • 原文地址:https://www.cnblogs.com/liyexin/p/13765495.html
Copyright © 2011-2022 走看看