BZOJ 3529 [Sdoi2014]数表 ——莫比乌斯反演 树状数组
$ans=\sum_{i=1}^n\sum_{j=1}^n\sigma(gcd(i,j))$
枚举gcd为d的所有数得到
$ans=\sum_{d<=n}\sigma(d)*g(d)$
$g(d)$表示所有(i,j)=d的二元组的数量。
那么可以反演得到$g(i)=\sum_{i \mid d}\mu(\lfloor d/i \rfloor )*\lfloor n/d \rfloor * \lfloor m/d \rfloor$
然后代入然后xjb变换可得
$ans=\sum_{d<=n}\lfloor n/d \rfloor * \lfloor m/d \rfloor \sum_{i \mid d}\mu( \lfloor d/i \rfloor ) * \sigma(i) $
然后我们要求出$\sum_{i \mid d}\mu(\lfloor d/i \rfloor ) *\sigma(i) $的前缀和就可以$\sqrt n$的时间内解决了
那么我们可以用每个数去暴力更新倍数即可,但是它是一个积性函数,是可以在$\Theta(n)$的时间内筛出来的。
但是有A的条件,我们可以去维护前缀和用树状数组,暴力更新倍数即可。
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define F(i,j,k) for (int i=j;i<=k;++i)
#define D(i,j,k) for (int i=j;i>=k;--i)
#define md 2147483647
#define inf 0x3f3f3f3f
#define maxn 100005
struct query{int n,m,k,id,ans;}a[maxn]; struct Bit_Tree{
int x[maxn];
void add(int i,int f)
{for (;i<maxn;i+=i&(-i))x[i]+=f;}
int gs(int i)
{
int ret=0;
for (;i;i-=i&(-i)) ret+=x[i];
return ret;
}
}BT; int sigma[maxn],pr[maxn],top,mu[maxn],min_fac_a[maxn],min_fac_sum[maxn],rk[maxn]; void init()
{
sigma[1]=1;mu[1]=1;rk[1]=1;
F(i,2,maxn-1)
{
rk[i]=i;
if (!sigma[i])
{
pr[++top]=i;
min_fac_a[i]=i;
sigma[i]=min_fac_sum[i]=i+1;
mu[i]=-1;
}
F(j,1,top)
{
if (pr[j]*i>=maxn) break;
if (i%pr[j]==0)
{
sigma[pr[j]*i]=sigma[i]/min_fac_sum[i]*
(min_fac_sum[pr[j]*i]=min_fac_sum[i]+min_fac_a[i]*pr[j]);
min_fac_a[pr[j]*i]=min_fac_a[i]*pr[j];
mu[pr[j]*i]=0;
break;
}
sigma[pr[j]*i]=sigma[pr[j]]*sigma[i];
min_fac_a[pr[j]*i]=pr[j];
min_fac_sum[pr[j]*i]=pr[j]+1;
mu[pr[j]*i]=-mu[i];
}
}
} int t; bool cmp(query x,query y)
{return x.k<y.k;} bool cmp2(query x,query y)
{return x.id<y.id;} bool cmp3(int x,int y)
{return sigma[x]<sigma[y];} void add(int i)
{
F(j,1,inf)
{
if (i*j>=maxn) break;
BT.add(i*j,sigma[i]*mu[j]);
}
} int solve(int n,int m)
{
int ret=0;
for (int i=1,last=0;i<=n;i=last+1)
{
last=min(n/(n/i),m/(m/i));
ret+=(BT.gs(last)-BT.gs(i-1))*(n/i)*(m/i);
}
return ret&md;
} int main()
{
init();
sort(rk+1,rk+maxn,cmp3);
scanf("%d",&t);
F(i,1,t)
{
scanf("%d%d%d",&a[i].n,&a[i].m,&a[i].k);
if (a[i].n>a[i].m) swap(a[i].n,a[i].m);
a[i].id=i;
}
sort(a+1,a+t+1,cmp);
int now=0;
F(i,1,t)
{
while (sigma[rk[now+1]]<=a[i].k) add(rk[++now]);
a[i].ans=solve(a[i].n,a[i].m);
}
sort(a+1,a+t+1,cmp2);
F(i,1,t) printf("%d\n",a[i].ans);
}
BZOJ 3529 [Sdoi2014]数表 ——莫比乌斯反演 树状数组的更多相关文章
- BZOJ 3529: [Sdoi2014]数表 [莫比乌斯反演 树状数组]
3529: [Sdoi2014]数表 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 1399 Solved: 694[Submit][Status] ...
- BZOJ 3529 [Sdoi2014]数表 (莫比乌斯反演+树状数组+离线)
题目大意:有一张$n*m$的数表,第$i$行第$j$列的数是同时能整除$i,j$的所有数之和,求数表内所有不大于A的数之和 先是看错题了...接着看对题了发现不会做了...刚了大半个下午无果 看了Po ...
- BZOJ 3259 [Sdoi2014]数表 (莫比乌斯反演 + 树状数组)
3529: [Sdoi2014]数表 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 2321 Solved: 1187[Submit][Status ...
- 【BZOJ3529】[Sdoi2014]数表 莫比乌斯反演+树状数组
[BZOJ3529][Sdoi2014]数表 Description 有一张N×m的数表,其第i行第j列(1 < =i < =礼,1 < =j < =m)的数值为能同时整除i和 ...
- BZOJ3529: [Sdoi2014]数表(莫比乌斯反演 树状数组)
题意 题目链接 Sol 首先不考虑\(a\)的限制 我们要求的是 \[\sum_{i = 1}^n \sum_{j = 1}^m \sigma(gcd(i, j))\] 用常规的套路可以化到这个形式 ...
- luogu3312 [SDOI2014]数表 (莫比乌斯反演+树状数组)
link \(\sum_{i=1}^n\sum_{j=1}^m[s(\gcd(i,j))\le a]s(\gcd(i,j))\) \(=\sum_{p=1}^ns(p)[s(p)\le a]\sum_ ...
- bzoj 3529 数表 莫比乌斯反演+树状数组
题目大意: 有一张N×m的数表,其第i行第j列(1 < =i < =礼,1 < =j < =m)的数值为能同时整除i和j的所有自然数之和.给定a,计算数表中不大于a的数之和. ...
- 【BZOJ3529】【莫比乌斯反演 + 树状数组】[Sdoi2014]数表
Description 有一张N×m的数表,其第i行第j列(1 < =i < =礼,1 < =j < =m)的数值为 能同时整除i和j的所有自然数之和.给定a,计算数表中不大于 ...
- BZOJ_3529_[Sdoi2014]数表_莫比乌斯反演+树状数组
Description 有一张 n×m 的数表,其第 i 行第 j 列(1 <= i <= n, 1 <= j <= m)的数值为 能同时整除 i 和 j 的所有自然数之和.给 ...
随机推荐
- Android adb命令,linux中各种命令
常用的ADB命令 1. 显示系统中全部Android平台: android list targets 2. 显示系统中全部AVD(模拟器): android list avd 3. 创建AVD(模拟器 ...
- 自定义可伸缩的imageView
直接上代码 /** * 自定义可伸缩的ImageView */ public class ZoomImageView extends ImageView { /** 画笔类 **/ private P ...
- 1、Centos7 python2.7和yum完全卸载及重装
完全重装python和yum 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 1.删除现有Python ...
- Java MVC 分页实例
共4个文件 requestLogList.jsp RequestInfoController.java RequestInfoBean.java RequestInfoService.java 1.r ...
- IOS命名
NS开头的名称不要出现. NS系统名称开头. 命名缩写只用于通用专业术语,如URL,不可自创命名缩写,如Ctr.Msg.命名宁可长一些,也不要难于理解. 是否在看别人代码时各种缩写而不知其所以然?简短 ...
- PHP识别二维码功能,php-zbarcode 安装
php-zbarcode是PHP识别二维码的扩展. 下面是安装方法,安装前要先安装ImageMagick.zbar. php-zbarcode 下载地址 安装ImageMagick: yum inst ...
- 洛谷 P1276 校门外的树(增强版)
题目描述 校门外马路上本来从编号0到L,每一编号的位置都有1棵树.有砍树者每次从编号A到B处连续砍掉每1棵树,就连树苗也不放过(记 0 A B ,含A和B):幸运的是还有植树者每次从编号C到D 中凡是 ...
- C#入门(3)
C#入门(3) Delegates, Events, Lambda Expressions 最早的windows是使用c风格的函数指针来进行callback的,但是这样仅仅传递了一个内存中的地址,无法 ...
- docker安装Tensorflow并使用jupyter notebook
目前网上提供的大多数的方法都是如下: docker pull tensorflow/tensorflow docker run -it -p : tensorflow/tensorflow 但是按照步 ...
- zust_第二周——瞎扯系列
首先来原题列表: A:Gridland http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1037 B:HangOver htt ...