试除法求约数
因为约数总是成对存在的,所以只需枚举前sqrt的元素
void solve()
{
int n;
cin>>n;
vector<int>arr;
for(int i=1;i<=n/i;i++)
{
if(n%i==0)
{
arr.push_back(i);
if(n/i!=i) arr.push_back(n/i);
}
}
sort(arr.begin(),arr.end());
for(int i=0;i<arr.size();i++) cout<<arr[i]<<' ';
cout<<endl;
}
约数个数
根据算数基本定理公式可以求出结果
void solve()
{
int t;
cin>>t;
map<int,int>mp;
while(t--)
{
int n;
cin>>n;
for(int i=2;i<=n/i;i++)
{
while(n%i==0)
{
mp[i]++;
n/=i;
}
}
if(n>1) mp[n]++;
}
LL res=1;
for(auto x:mp)
{
res=res*(x.second+1)%MOD;
//cout<<x.first<<' '<<x.second<<endl;
}
cout<<res<<endl;
}
约数之和
根据算数基本定理可以求出答案
void solve()
{
int t;
cin>>t;
map<int,int>mp;
while(t--)
{
int n;
cin>>n;
for(int i=2;i<=n/i;i++)
{
while(n%i==0)
{
mp[i]++;
n/=i;
}
}
if(n>1) mp[n]++;
}
LL res2=1;
for(auto x:mp)
{
LL a=x.first,b=x.second,t=1;
while(b--)
{
t=(t*a+1)%MOD;
}
//cout<<t<<endl;
//cout<<res<<endl;
res2=res2*t%MOD;
// cout<<x.first<<' '<<x.second<<endl;
}
// 2^5*3. 1+2+4+8+16+32=63 4
cout<<res2<<endl;
}
最大公约数
直接使用STL
void solve()
{
int a,b;
cin>>a>>b;
cout<<__gcd(a,b)<<endl;
}