约数
求一个数约数的个数
试除法求约数:
给定 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; }
                
            
        
浙公网安备 33010602011771号