一个数表上第i行第j列表示能同时整除i和j的自然数,Q<=2e4个询问,每次问表上1<=x<=n,1<=y<=m区域内所有<=a的数之和。n,m<=1e5,a<=1e9。对2^31取模。

这个a很讨厌就先不理他。首先i行j列的那个数其实是$a_{ij}=\sum_{x|gcd(i,j)} x$,令$s(t)=\sum_{x|t}x$,然后gcd(i,j)是只有1e5的,可以先把s数组预处理出来。s是积性函数所以线性筛可以搞,但复杂度不在这里,直接埃筛也行。

那现在就是看[1,min(n,m)]中每个数作为gcd的s(t)被算了多少次,也就是1<=x<=n,1<=y<=m中有多少(x,y)=t,记这次数叫f(t),那f(t)是经典的可以反演的式子,反演就不写了,最后$f(t)=\sum_{t|d}\mu(\frac{d}{t})\frac{n}{d}\frac{m}{d}$,最后要求的就是$\sum_{t=1}^{min(n,m)}s(t)\sum_{t|d}\mu(\frac{d}{t})\frac{n}{d}\frac{m}{d}$。

然后我就卡住了。这里用个套路二把后面那俩提出来,变成:$\sum_{d=1}^{min(n,m)}\frac{n}{d}\frac{m}{d}\sum_{t|d}s(t)\mu(\frac{d}{t})$,漂亮,后面那东西(记h(d))预处理一下即可,然后就\sqrt n出解。

然而有了a的限制之后,后面那东西就变得飘忽不定了,这时候需要离线,然后所有s(t)排个序,每次询问前把<=当前a的所有s(t)加给对应的h(d),然后查区间和用树状数组即可。这样就可以在$nlog^2 n+q\sqrt n logn$出解了。

然而排序时忘了cmp函数了。 然而过程中忘了取模导致爆longlong了。 然而没考虑到有负数。 然而树状数组忘开longlong了。

然而最后跑得贼慢,其实对2^31取模只需要int自然溢出最后&2147483647即可。

 //#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
//#include<bitset>
#include<algorithm>
//#include<cmath>
using namespace std; int T,n,m,A;
#define maxn 100011
int miu[maxn],s[maxn],prime[maxn],lp,us[maxn]; bool notprime[maxn];
int snum[maxn];
bool cmp(const int &a,const int &b) {return s[a]<s[b];}
void pre(int n)
{
for (int i=;i<=n;i++)
for (int j=i;j<=n;j+=i)
s[j]+=i;
for (int i=;i<=n;i++) snum[i]=i;
sort(snum+,snum++n,cmp);
miu[]=; lp=;
for (int i=;i<=n;i++)
{
if (!notprime[i]) {prime[++lp]=i; miu[i]=-;}
for (int j=;j<=lp && 1ll*prime[j]*i<=n;j++)
{
notprime[i*prime[j]]=;
if (i%prime[j]) miu[i*prime[j]]=-miu[i];
else {miu[i*prime[j]]=; break;}
}
}
for (int i=;i<=n;i++)
for (int j=i,cnt=;j<=n;j+=i,cnt++)
us[j]+=miu[cnt]*s[i];
} #define LL long long
struct BIT
{
LL a[maxn],n;
BIT() {n=;}
void add(int x,int v) {for (;x<=n;x+=x&-x) a[x]+=v;}
LL query(int x) {LL ans=; for (;x;x-=x&-x) ans+=a[x]; return ans;}
}t; struct Q
{
int n,m,a,id;
bool operator < (const Q &b) const {return a<b.a;}
}q[maxn];
LL ans[maxn]; const int base=;
int main()
{
pre(base);
scanf("%d",&T);
for (int i=;i<=T;i++) scanf("%d%d%d",&q[i].n,&q[i].m,&q[i].a),q[i].id=i;
sort(q+,q++T); int j=;
const LL tmp=1ll<<;
for (int c=;c<=T;c++)
{
while (j<=base && s[snum[j]]<=q[c].a)
{
for (int k=snum[j],cnt=;k<=base;k+=snum[j],cnt++)
t.add(k,s[snum[j]]*miu[cnt]);
j++;
}
LL Ans=;
for (int i=,to=min(q[c].n,q[c].m),last;i<=to;i=last+)
{
last=min(q[c].n/(q[c].n/i),q[c].m/(q[c].m/i));
Ans+=1ll*(q[c].n/i)*(q[c].m/i)*(t.query(last)-t.query(i-))%tmp,
Ans-=Ans>=tmp?tmp:,Ans+=Ans<?tmp:;
}
ans[q[c].id]=Ans;
} for (int c=;c<=T;c++) printf("%lld\n",ans[c]);
return ;
}

莫比乌斯反演套路二--(n/d)(m/d)给提出来--BZOJ3529: [Sdoi2014]数表的更多相关文章

  1. bzoj3529: [Sdoi2014]数表 莫比乌斯反演

    题意:求\(\sum_{i=1}^n\sum_{j=1}^nf(gcd(i,j))(gcd(i,j)<=a),f(x)是x的因子和函数\) 先考虑没有限制的情况,考虑枚举gcd为x,那么有\(\ ...

  2. BZOJ3529 [Sdoi2014]数表 【莫比乌斯反演】

    3529: [Sdoi2014]数表 Time Limit: 10 Sec Memory Limit: 512 MB Submit: 2151 Solved: 1080 [Submit][Status ...

  3. 莫比乌斯反演套路三、四--BZOJ2154: Crash的数字表格 && BZOJ2693: jzptab

    t<=1e4个询问每次问n,m<=1e7,$\sum_{1\leqslant x \leqslant n,1 \leqslant y\leqslant m}lcm(x,y)$. 首先题目要 ...

  4. 莫比乌斯反演套路一--令t=pd--BZOJ2820: YY的GCD

    t<=10000组询问:有多少x,y,满足$x\epsilon [1,n],y\epsilon [1,m],(x,y)为质数$.n,m<=1e7. 首先式子列出来,f(i)--1<= ...

  5. BZOJ3529: [Sdoi2014]数表(莫比乌斯反演 树状数组)

    题意 题目链接 Sol 首先不考虑\(a\)的限制 我们要求的是 \[\sum_{i = 1}^n \sum_{j = 1}^m \sigma(gcd(i, j))\] 用常规的套路可以化到这个形式 ...

  6. BZOJ3529 [Sdoi2014]数表【莫比乌斯反演】

    Description 有一张 n×m 的数表,其第 i 行第 j 列(1 <= i <= n, 1 <= j <= m)的数值为 能同时整除 i 和 j 的所有自然数之和.给 ...

  7. [bzoj3529][Sdoi2014]数表_树状数组_莫比乌斯反演

    数表 bzoj-3529 Sdoi-2014 题目大意:n*m的数表,第i行第j列的数是同时整除i和j的所有自然数之和.给定a,求数表中所有不超过a的和. 注释:$1\le n,m \le 10^5$ ...

  8. BZOJ3529: [Sdoi2014]数表 莫比乌斯反演_树状数组

    Code: #include <cstdio> #include <algorithm> #include <cstring> #define ll long lo ...

  9. BZOJ3529: [Sdoi2014]数表(莫比乌斯反演,离线)

    Description 有一张 n×m 的数表,其第 i 行第 j 列(1 <= i <= n, 1 <= j <= m)的数值为 能同时整除 i 和 j 的所有自然数之和.给 ...

随机推荐

  1. 关于jquery获取单选框value属性值为on的问题

    当取单选框的value值的时候,前提是要有value这个属性,如果没有value属性那么取出来的就会为on 取value值的常见三种方式为 $("input[name='XXX']:chec ...

  2. MySQL DECIMAL数据类型

    https://blog.csdn.net/zyz511919766/article/details/49335565

  3. Android与H5互调(通过实例来了解Hybrid App)

    前些日子,Android原生开发将被取缔的吵得火热,JavaScript是能做一个完全的APP,但只使用JavaScript做出来的APP也不会牛逼到哪里去.最好的是混合(Hybrid)开发,在需要的 ...

  4. php从mysql数据库中取数据

    php从数据库中取数据  面向过程 <?php $server_name="localhost:3306"; //数据库服务器名称 $username="root& ...

  5. codeforces_1066_B.Heaters

    题意:一个数组只含有0或1,1表示该元素可以覆盖其自身.左边r-1个元素和右边r-1个元素,问最少保留多少个1元素可以覆盖整个数组. 思路:一个指针指向当前未被覆盖的最左边的元素下标,每次找离它最远且 ...

  6. 转:谈谈iOS中粘性动画以及果冻效果的实现

    在最近做个一个自定义PageControl——KYAnimatedPageControl中,我实现了CALayer的形变动画以及CALayer的弹性动画,效果先过目: 先做个提纲: 第一个分享的主题是 ...

  7. Java C

    先说一下自己叫什么,免得面试的人张冠李戴. 介绍自己有几个方面:1学什么专业的那方面学的过硬,可以说的具体点. 2以前做过什么.(这家公司要你肯定是和你的经历有关.) 3现在来这家公司的目的是什么(当 ...

  8. gifsicle for linux ----------gif 图像处理

    1.gifsicle 在linux 中的使用下载gifsicle yum install gifsicle 若发现没有此包 ,更新epel第三方软件库 sudo yum install epel-re ...

  9. Python机器学习——DBSCAN聚类

    密度聚类(Density-based Clustering)假设聚类结构能够通过样本分布的紧密程度来确定.DBSCAN是常用的密度聚类算法,它通过一组邻域参数(ϵϵ,MinPtsMinPts)来描述样 ...

  10. C++操作MYSQL遇到的一些问题

    首先 我使用的是 vcpkg<不知道的可以进行百度 可以剧透一下,这个对Visual Studio使用一些C++的轮子太方便了, 上面是我装的一些库<大大安利vcpkg 安装时一定要使用p ...