luogu P3312 [SDOI2014]数表
我们看要求的东西$$\sum_{i=1}{n}\sum_{j=1}{m}[\sigma(gcd(i,j))\le a]\sigma(gcd(i,j))$$
然而\(\le a\)比较烦,可以先去掉这个限制
没有这个限制,我们显然可以枚举每个k,求出gcd为k的数字对数,然后乘上\(\sigma(k)\)再加起来
把这个柿子写出来$$\sum_{k=1}{min(n,m)}\sigma(k)\sum_{i=1}{n}\sum_{j=1}^{m}[gcd(i,j)=k]$$
根据套路,可以得到$$\sum_{i=1}{n}\sum_{j=1}{m}[gcd(i,j)=k]=\sum_{k|d}\mu(\frac{d}{k})\lfloor\frac{n}{d}\rfloor\lfloor\frac{m}{d}\rfloor$$
所以原式等于$$\sum_{k=1}{min(n,m)}\sigma(k)\sum_{k|d}\mu(\frac{d}{k})\lfloor\frac{n}{d}\rfloor\lfloor\frac{m}{d}\rfloor$$$$\sum_{d=1}{min(n,m)}\lfloor\frac{n}{d}\rfloor\lfloor\frac{m}{d}\rfloor\sum_{k|d}\sigma(k)\mu(\frac{d}{k})$$
后面那个东西可以枚举倍数,然后求出前缀和,然后直接数论分块救星了
现在加上\(a\)的限制,那么只有\(\le a\)的\(\sigma(k)\)能造成贡献,所以把询问离线,然后按\(a\)排序,依次把满足条件的\(\sigma(k)\)加进前缀和,因为要动态维护前缀和,树状数组即可
#include<bits/stdc++.h>
#define LL long long
#define db double
#define il inline
#define re register
using namespace std;
const int N=1e5+10;
il int rd()
{
int x=0,w=1;char ch=0;
while(ch<'0'||ch>'9') {if(ch=='-') w=-1;ch=getchar();}
while(ch>='0'&&ch<='9') {x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
return x*w;
}
int q,a[N],an[N];
LL prm[N],mu[N],pp[N],xgm[N],tt,ans;
il bool cmp(int a,int b){return xgm[a]<xgm[b];}
int c[N];
il int md(int x){return x&2147483647;}
il void ad(int x,int y){while(x<=N-10) c[x]+=y,x+=x&(-x);}
il int gsm(int x){int an=0;while(x) an+=c[x],x-=x&(-x);return an;}
struct node
{
int n,m,a,i;
bool operator < (const node &bb) const {return a<bb.a;}
}qq[N];
int main()
{
mu[1]=1;
for(int i=2;i<=N-10;++i)
{
if(!pp[i]) pp[i]=1,mu[i]=-1,prm[++tt]=i;
for(int j=1;j<=tt&&i*prm[j]<=N-10;++j)
{
pp[i*prm[j]]=1,mu[i*prm[j]]=-mu[i];
if(i%prm[j]==0) {mu[i*prm[j]]=0;break;}
}
}
for(int i=1;i<=N-10;++i)
for(int j=i;j<=N-10;j+=i)
xgm[j]+=i;
for(int i=1;i<=N-10;++i) a[i]=i;
sort(a+1,a+N-10+1,cmp);
q=rd();
for(int i=1;i<=q;++i)
{
qq[i].n=rd(),qq[i].m=rd(),qq[i].a=rd(),qq[i].i=i;
if(qq[i].n>qq[i].m) swap(qq[i].n,qq[i].m);
}
sort(qq+1,qq+q+1);
for(int i=1,j=1;i<=q;++i)
{
while(j<=N-10&&xgm[a[j]]<=qq[i].a)
{
int x=a[j];
for(int k=1;x*k<=N-10;++k) ad(x*k,xgm[x]*mu[k]);
++j;
}
int n=qq[i].n,m=qq[i].m,ii=qq[i].i;
for(int k=1,l;k<=n;k=l+1)
{
l=min(n/(n/k),m/(m/k));
an[ii]=an[ii]+(gsm(l)-gsm(k-1))*(n/k)*(m/k);
}
}
for(int i=1;i<=q;++i) printf("%d\n",md(an[i]));
return 0;
}
luogu P3312 [SDOI2014]数表的更多相关文章
- 洛谷 P3312 [SDOI2014]数表 解题报告
P3312 [SDOI2014]数表 题目描述 有一张\(N*M\)的数表,其第\(i\)行第\(j\)列(\(1\le i \le n\),\(1 \le j \le m\))的数值为能同时整除\( ...
- 洛谷P3312 - [SDOI2014]数表
Portal Solution 共\(T(T\leq2\times10^4)\)组测试数据.给出\(n,m(n,m\leq10^5),a(a\leq10^9)\),求\[ \sum_{i=1}^n\s ...
- P3312 [SDOI2014]数表
啊啊啊我昨天怎么没写题解wwww 补昨日题解... 题目链接 : https://www.luogu.org/problemnew/show/P3312 也是莫反 我要把fft留到今天写 [和zyn小 ...
- [bzoj3529] [洛谷P3312] [Sdoi2014] 数表
Description 有一张n×m的数表,其第i行第j列(1 < =i < =n,1 < =j < =m)的数值为 能同时整除i和j的所有自然数之和.给定a,计算数表中不大于 ...
- Luogu 3312 [SDOI2014]数表
在这一篇里把所有的套路写全方便自己之后复习. 首先是一个小学生数学:$a$整除$b$ $ = $ $\frac{b}{a}$ 也就是说这题中格子$(i, j)$的值就是既能被$i$整除又能被$j$整 ...
- 洛谷P3312 [SDOI2014]数表(莫比乌斯反演+树状数组)
传送门 不考虑$a$的影响 设$f(i)$为$i$的约数和 $$ans=\sum\limits_{i=1}^n\sum\limits_{j=1}^nf(gcd(i,j))$$ $$=\sum\limi ...
- 洛谷 P3312 [SDOI2014]数表
式子化出来是$\sum_{T=1}^m{\lfloor}\frac{n}{T}{\rfloor}{\lfloor}\frac{m}{T}{\rfloor}\sum_{k|T}\mu(\frac{T}{ ...
- 并不对劲的bzoj3529:loj2193:p3312:[SDOI2014]数表
题目大意 定义函数\(f(x)=\sum_{k|x}k\) \(t\)(\(t\leq2*10^4\))组询问,每组给定\(n,m,a\)(\(n,m\leq10^5,a\leq10^9\)),求: ...
- bzoj [SDOI2014]数表 莫比乌斯反演 BIT
bzoj [SDOI2014]数表 莫比乌斯反演 BIT 链接 bzoj luogu loj 思路 \[ \sum\limits_{i=1}^{n}\sum\limits_{j=1}^{m}a*[f[ ...
随机推荐
- Callable和Future、FutureTask的使用
http://www.silencedut.com/2016/06/15/Callable%E5%92%8CFuture%E3%80%81FutureTask%E7%9A%84%E4%BD%BF%E7 ...
- [luogu4309][最长上升子序列]
题目链接 思路 因为这些数字是从小到大加进去的,所以以当前数字结尾的最长上升子序列可以从前面位置的任何一个数字转移过来.所以只要能知道每个数字最终位于哪个位置就行了. 没想到出了treap还有什么办法 ...
- flask Blueprint蓝图
首先要了解蓝图的作用,模拟场景在团队开发过程中团队每个人都在写自己负责的功能模块,那多个py文件模板,我们如果完成后需要运行是不是要运行多个服务?但是我们的项目是一个整体,而不是零散的,所以我们怎么把 ...
- (六)Oracle 的 oracle表查询关键字
参考:http://www.hechaku.com/Oracle/oracle_tables2.html 1.使用逻辑操作符号问题:查询工资高于500或者是岗位为manager的雇员,同时还要满足他们 ...
- WebService 及 CXF 的进阶讲解
4.2. WebService请求深入分析 1). 分析WebService的WSDL文档结构 1.1). 实例截图 <definitions> <types> <sch ...
- JDBC的简单笔记
JDBC笔记: JDBC:java database connectivity SUN公司提供的一套操作数据库的标准规范. JDBC与数据库驱动的关系:接口与实现的关系. JDBC规范(掌握四个核心对 ...
- 牛客网 2018年东北农业大学春季校赛 L题 wyh的天鹅
链接:https://www.nowcoder.com/acm/contest/93/L来源:牛客网 时间限制:C/C++ 3秒,其他语言6秒空间限制:C/C++ 262144K,其他语言524288 ...
- JS学习笔记Day4
一.什么是函数 将反复使用的功能代码,封装成一独立的模块,这个模块叫做函数 二.封装函数的好处 1.一次封装,多次使用 2.使程序可控 三.函数的分类:内置()函数和自定义函数 四.函数的数据类型(f ...
- grub.conf解析
一.grub简介系统启动引导管理器,是在计算机启动后运行的第一个程序,他是用来负责加载.传输控制到操作系统的内核,一旦把内核挂载,系统引导管理器的任务就算完成退出,系统引导的其它部份,比如系统的初始化 ...
- BZOJ2157 边转点 树链剖分
https://www.lydsy.com/JudgeOnline/problem.php?id=2157 现在就是后悔,非常后悔 本来想随便拿个树剖热身,不料开了个毒瘤题. 题意:动态维护一棵树上的 ...