约数

求一个数约数的个数

试除法求约数:

给定 nn 个正整数 aiai,对于每个整数 aiai,请你按照从小到大的顺序输出它的所有约数。

输入格式

第一行包含整数 nn。

接下来 nn 行,每行包含一个整数 aiai。

输出格式

输出共 nn 行,其中第 ii 行输出第 ii 个整数 aiai 的所有约数。

数据范围

1n1001≤n≤100,
2ai2×1092≤ai≤2×109

输入样例:

2
6
8

输出样例:

1 2 3 6 
1 2 4 8

复制代码
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
vector<int> ys(int n)
{
    vector<int> res;
    for(int i=1;i<=n/i;i++)
    {
        if(n%i==0)
        {
            res.push_back(i);
            if(i!=n/i) res.push_back(n/i);
        }
    }
    sort(res.begin(),res.end());
    return res;
}
int main(){
    int n;
    cin>>n;
    while(n--)
    {
        int x;
        cin>>x;
        auto res=ys(x);
        for(auto x:res)
            cout<<x<<" ";
        cout<<endl;
    }
    return 0;
}
复制代码

有一个这样的一个定理:

 

在int范围内约数最多的大概是1500个左右

 

 这个是约数之和

给定 nn 个正整数 aiai,请你输出这些数的乘积的约数个数,答案对 109+7109+7 取模。

输入格式

第一行包含整数 nn。

接下来 nn 行,每行包含一个整数 aiai。

输出格式

输出一个整数,表示所给正整数的乘积的约数个数,答案需对 109+7109+7 取模。

数据范围

1n1001≤n≤100,
1ai2×1091≤ai≤2×109

输入样例:

3
2
6
8

输出样例:

12

复制代码
#include<iostream>
#include<unordered_map>
using namespace std;
typedef long long ll;
const int mod=1e9+7;
int main(){
    int n;
    cin>>n;
    unordered_map<int,int> mp;
    while(n--)
    {
        int x;
        cin>>x;
        for(int i=2;i<=x/i;i++)
        {
            while(x%i==0)
            {
                x/=i;
                mp[i]++;
            }
        }
        if(x>1) mp[x]++;
    }
    ll sum=1;
    for(auto item:mp)
        sum=(sum*(item.second+1))%mod;
    cout<<sum<<endl;
    return 0;
}
复制代码

给定 nn 个正整数 aiai,请你输出这些数的乘积的约数之和,答案对 109+7109+7 取模。

输入格式

第一行包含整数 nn。

接下来 nn 行,每行包含一个整数 aiai。

输出格式

输出一个整数,表示所给正整数的乘积的约数之和,答案需对 109+7109+7 取模。

数据范围

1n1001≤n≤100,
1ai2×1091≤ai≤2×109

输入样例:

3
2
6
8

输出样例:

252

哦靠,第一次那么的佩服y总,最后算的那个步骤太厉害了,太惊艳了这个方法,我的天哪

 

 (来自最高赞题解)

复制代码
#include<iostream>
#include<unordered_map>
using namespace std;
typedef long long ll;
const int N=1e9+7;
int mod=N;
int main(){
    unordered_map<int,int> mp;
    int n;
    cin>>n;
    while(n--)
    {
        int x;
        cin>>x;
        for(int i=2;i<=x/i;i++)
        {
            while(x%i==0)
            {
                x/=i;
                mp[i]++;
            }
        }
        if(x>1) mp[x]++;
    }
    ll res=1;
    for(auto item:mp)
    {
        auto a=item.first,b=item.second;
        ll t=1;
        while(b--) t=(t*a+1)%mod;
        res=res*t;
    }
    cout<<res<<endl;
    return 0;
}
复制代码

 

posted @   小志61314  阅读(342)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
点击右上角即可分享
微信分享提示