# BZOJ 3529 SDOI2014 数表 莫比乌斯反演+树状数组

667 篇文章 1 订阅
13 篇文章 0 订阅
32 篇文章 0 订阅

n,m<=10^5,a<=10^9

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define M 100100
using namespace std;
struct query{
int n,m,a,_id;
bool operator < (const query &x) const
{
return a < x.a ;
}
}queries[20200];
int T,ans[20200];
pair<int,int>f[M];
int mu[M],prime[M],tot;
bool not_prime[M];
void Linear_Shaker()
{
static int min_factor_a[M],min_factor_sum[M];
/*
12=2*2*3 F(12)=(1+2+4)*(1+3)
min_factor_a[12]=2*2=4
min_factor_sum[12]=1+2+4=7
*/
int i,j;
f[1]=make_pair(1,1);mu[1]=1;
for(i=2;i<=100000;i++)
{
f[i].second=i;
if(!not_prime[i])
{
prime[++tot]=i;
min_factor_a[i]=i;
f[i].first=min_factor_sum[i]=i+1;
mu[i]=-1;
}
for(j=1;j<=tot&&prime[j]*i<=100000;j++)
{
not_prime[prime[j]*i]=1;
if(i%prime[j]==0)
{
f[prime[j]*i].first=f[i].first/min_factor_sum[i]*
(min_factor_sum[prime[j]*i]=min_factor_sum[i]+min_factor_a[i]*prime[j]);
min_factor_a[prime[j]*i]=min_factor_a[i]*prime[j];
mu[prime[j]*i]=0;
break;
}
f[prime[j]*i].first=f[i].first*(prime[j]+1);
min_factor_a[prime[j]*i]=prime[j];
min_factor_sum[prime[j]*i]=prime[j]+1;
mu[prime[j]*i]=-mu[i];
}
}
}
namespace BIT{
int c[M];
inline void Update(int x,int y)
{
for(;x<=100000;x+=x&-x)
c[x]+=y;
}
inline int Get_Ans(int x)
{
int re=0;
for(;x;x-=x&-x)
re+=c[x];
return re;
}
}
int Query(int n,int m)
{
int i,last,re=0;
if(n>m) swap(n,m);
for(i=1;i<=n;i=last+1)
{
last=min(n/(n/i),m/(m/i));
re+=(n/i)*(m/i)*(BIT::Get_Ans(last)-BIT::Get_Ans(i-1));
}
return re&2147483647;
}
int main()
{
int i,j,k;
Linear_Shaker();
sort(f+1,f+100000+1);
cin>>T;
for(i=1;i<=T;i++)
scanf("%d%d%d",&queries[i].n,&queries[i].m,&queries[i].a),queries[i]._id=i;
sort(queries+1,queries+T+1);
for(i=1,j=1;i<=T;i++)
{
for(;j<=100000&&f[j].first<=queries[i].a;j++)
for(k=f[j].second;k<=100000;k+=f[j].second)
BIT::Update(k,f[j].first*mu[k/f[j].second]);
ans[queries[i]._id]=Query(queries[i].n,queries[i].m);
}
for(i=1;i<=T;i++)
printf("%d\n",ans[i]);
return 0;
}


11-24 33

11-26 38
10-13 256
08-06 26
04-01 55
08-03 29
09-25 3308
09-29 3230
11-13 3458
08-22 4170
09-14 119

### “相关推荐”对你有帮助么？

• 非常没帮助
• 没帮助
• 一般
• 有帮助
• 非常有帮助

PoPoQQQ

¥2 ¥4 ¥6 ¥10 ¥20

1.余额是钱包充值的虚拟货币，按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载，可以购买VIP、C币套餐、付费专栏及课程。