题目描述
题解
根据题目化出一坨式子:
∑Ni=1[(i,N)>=M]
=∑Ni=1∑Nd=M[(i,N)=d]
=∑Nd=M∑Ni=1[(id,Nd)=1]
令i=dj
=∑Nd=M∑Ndj[(j,Nd)=1]
=∑Nd=Mϕ(Nd)
『转化』
枚举d=M到N转化为枚举N的约数。
代码
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
#define LL long long
LL T,n,m,ans;
inline LL phi(LL x){
LL ans=x;
for (LL i=2;i*i<=x;++i)
if (x%i==0){
ans=ans*(i-1)/i;
while (x%i==0) x/=i;
}
if (x>1) ans=ans*(x-1)/x;
return ans;
}
int main(){
scanf("%lld",&T);
while (T--){
scanf("%lld%lld",&n,&m);
ans=0;
for (LL i=1;i*i<=n;++i)
if (n%i==0){
if (i>=m) ans+=phi(n/i);
if (n/i>=m&&i!=n/i) ans+=phi(i);
}
printf("%lld\n",ans);
}
}
总结
化式子的目的是能让我们一眼看出来怎样在科学的时间空间复杂度下用计算机搞出来。——zky