1. 程式人生 > 資訊 >微信上線新年隱藏款異形紅包封面,可通過朋友圈廣告領取

微信上線新年隱藏款異形紅包封面,可通過朋友圈廣告領取

求一個數約數的個數

試除法求約數:

給定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;
}