题意
求∑i=1n∑j=1m[σ1(gcd(i,j))≤a]σ1(gcd(i,j))\sum_{i=1}^n \sum_{j=1}^m [\sigma_1(\gcd(i,j))\le a]\sigma_1(\gcd(i,j))∑i=1n∑j=1m[σ1(gcd(i,j))≤a]σ1(gcd(i,j))
分析

代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e5+5;
const ll mod=(1ll<<31);
int T;
struct qquery
{
int n,m,a,id;
}q[maxn];
bool cmp(qquery x,qquery y)
{
return x.a<y.a;
}
ll c[maxn],ans[maxn];
int is[maxn],pr[maxn],mu[maxn],cnt;
int sd[maxn],num[maxn];
void init()
{
mu[1]=1;
sd[1]=1;
for(int i=2;i<maxn;i++)
{
if(!is[i])
{
pr[++cnt]=i;
mu[i]=-1;
sd[i]=i+1;
num[i]=i+1;
}
for(int j=1;j<=cnt && pr[j]*i<maxn;j++)
{
is[pr[j]*i]=1;
if(i%pr[j]==0)
{
mu[i*pr[j]]=0;
sd[i*pr[j]]=sd[i]/num[i]*(num[i]*pr[j]+1);
num[i*pr[j]]=num[i]*pr[j]+1;
break;
}
mu[i*pr[j]]=-mu[i];
sd[i*pr[j]]=sd[i]*(pr[j]+1);
num[i*pr[j]]=pr[j]+1;
}
}
}
struct sigma
{
int sum,id;
}e[maxn];
bool cmpp(sigma x,sigma y)
{
return x.sum<y.sum;
}
int lowbit(int x)
{
return x&(-x);
}
void modify(int x,int y)
{
while(x<maxn)
{
c[x]=(c[x]+y)%mod;
x+=lowbit(x);
}
}
ll query(int x)
{
ll res=0;
while(x)
{
res=(res+c[x]+mod)%mod;
x-=lowbit(x);
}
return res;
}
void update(int id)
{
int k=e[id].id;
for(int i=1;i*k<maxn;i++)
modify(i*k,mu[i]*e[id].sum);
}
int main()
{
freopen("a.in","r",stdin);
freopen("a.out","w",stdout);
init();
scanf("%d",&T);
for(int i=1;i<=T;i++) scanf("%d%d%d",&q[i].n,&q[i].m,&q[i].a),q[i].id=i;
sort(q+1,q+T+1,cmp);
for(int i=1;i<maxn;i++)
e[i].sum=sd[i],e[i].id=i;
sort(e+1,e+maxn,cmpp);
int now=1;
for(int i=1;i<=T;i++)
{
while(e[now].sum<=q[i].a) update(now),now++;
int n=q[i].n,m=q[i].m;
if(n>m) swap(n,m);
for(int l=1,r;l<=n;l=r+1)
{
r=min(n/(n/l),m/(m/l));
ans[q[i].id]=(ans[q[i].id]+1ll*(query(r)-query(l-1))*(n/l)%mod*(m/l)+mod)%mod;
}
}
for(int i=1;i<=T;i++) printf("%lld\n",(ans[i]%mod+mod)%mod);
return 0;
}
1151

被折叠的 条评论
为什么被折叠?



