微信上線新年隱藏款異形紅包封面,可通過朋友圈廣告領取
阿新 • • 發佈:2022-01-13
求一個數約數的個數
試除法求約數:
給定nn個正整數aiai,對於每個整數aiai,請你按照從小到大的順序輸出它的所有約數。
輸入格式
第一行包含整數nn。
接下來nn行,每行包含一個整數aiai。
輸出格式
輸出共nn行,其中第ii行輸出第ii個整數aiai的所有約數。
資料範圍
1≤n≤1001≤n≤100,
2≤ai≤2×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取模。
資料範圍
1≤n≤1001≤n≤100,
1≤ai≤2×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取模。
資料範圍
1≤n≤1001≤n≤100,
1≤ai≤2×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; }