传送门
刚开始有一个非常傻逼的方法
就是画柿子画成了这个样子
#include
#include
#include
#include
#include
#include
using namespace std;
#define Mod 1073741824
#define N 4000005
#define LL long long
int T,n,m,ans;
int p[N],prime[N],mu[N],f[N];
void get(int n)
{
mu[1]=1;
for (int i=2;i<=n;++i)
{
if (!p[i])
{
prime[++prime[0]]=i;
mu[i]=-1;
}
for (int j=1;j<=prime[0]&&i*prime[j]<=n;++j)
{
int t=i*prime[j];
p[t]=1;
if (i%prime[j]==0)
{
mu[t]=0;
break;
}
else mu[t]=-mu[i];
}
}
for (int i=1;i<=n;++i)
if (mu[i])
for (int j=1;j*i<=n;j++) f[j*i]=f[j*i]+mu[j]*j*j*i;
for (int i=1;i<=n;i++) f[i]=f[i]+f[i-1];
}
int calc(int n,int m)
{
return (n*(n+1)>>1)*(m*(m+1)>>1);
}
int main()
{
get(4000000);
scanf("%d",&T);
while (T--)
{
scanf("%d%d",&n,&m);
if (n>m) swap(n,m);
ans=0;
for (int i=1,j=0;i<=n;i=j+1)
{
j=min(n/(n/i),m/(m/i));
ans+=calc(n/i,m/i)*(f[j]-f[i-1]);
}
ans=(ans%Mod+Mod)%Mod;
printf("%d\n",ans);
}
}
#include
#include
#include
#include
#include
#include
using namespace std;
#define Mod 1073741824
#define N 4000005
#define LL long long
int T,n,m,ans;
int p[N],prime[N],mu[N],f[N],g[N],t[N];
void get(int n)
{
f[1]=1;
for (int i=2;i<=n;++i)
{
if (!p[i])
{
prime[++prime[0]]=i;
f[i]=i-i*i;
t[i]=1;
}
for (int j=1;j<=prime[0]&&i*prime[j]<=n;++j)
{
p[i*prime[j]]=1;
if (i%prime[j]==0)
{
if (t[i]>=2) f[i*prime[j]]=0;
else
f[i*prime[j]]=-f[i/prime[j]]*prime[j]*prime[j]*prime[j];
t[i*prime[j]]=t[i]+1;
break;
}
else
{
f[i*prime[j]]=f[i]*f[prime[j]];
t[i*prime[j]]=1;
}
}
}
for (int i=1;i<=n;i++) f[i]=f[i]+f[i-1];
}
int calc(int n,int m)
{
return (n*(n+1)>>1)*(m*(m+1)>>1);
}
int main()
{
get(4000000);
scanf("%d",&T);
while (T--)
{
scanf("%d%d",&n,&m);
if (n>m) swap(n,m);
ans=0;
for (int i=1,j=0;i<=n;i=j+1)
{
j=min(n/(n/i),m/(m/i));
ans+=calc(n/i,m/i)*(f[j]-f[i-1]);
}
ans=(ans%Mod+Mod)%Mod;
printf("%d\n",ans);
}
}