计算与 n 最大公约数一定的数的数量
如何方便地计算
首先,我们求出
下面这个式子的原理是,我们枚举与
这样,我们可以写出
这样,我们从大到小依次算
这样,时间复杂度为
vector<int> d,f;
for(int i=1;i*i<=n;i++){
if(n%i==0){
d.push_back(i);
if(i!=n/i)d.push_back(n/i);
}
}
sort(d.begin(),d.end());
f.resize(d.size());
for(int i=0;i<d.size();i++)
f[i]=m/d[i];
for(int i=d.size()-1;i>=0;i--)
for(int j=d.size()-1;j>i;j--)
if(d[j]%d[i]==0)
f[i]-=f[j];