约数
求一个数约数的个数
试除法求约数:
给定
输入格式
第一行包含整数
接下来
输出格式
输出共
数据范围
输入样例:
2
6
8
输出样例:
1 2 3 6 1 2 4 8
#include#include #include 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< " "; cout<<endl; } return 0; }
有一个这样的一个定理:
在int范围内约数最多的大概是1500个左右
这个是约数之和
给定
输入格式
第一行包含整数
接下来
输出格式
输出一个整数,表示所给正整数的乘积的约数个数,答案需对
数据范围
输入样例:
3
2
6
8
输出样例:
12
#include#include 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< endl; return 0; }
给定
输入格式
第一行包含整数
接下来
输出格式
输出一个整数,表示所给正整数的乘积的约数之和,答案需对
数据范围
输入样例:
3
2
6
8
输出样例:
252
哦靠,第一次那么的佩服y总,最后算的那个步骤太厉害了,太惊艳了这个方法,我的天哪
(来自最高赞题解)
#include#include 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< endl; return 0; }