\[\sum_{i=1}^N\sum_{j=1}^Mσ(gcd(i,j))[σ(gcd(i,j))<=a]
\]

\(σ\)表示约数和函数

感觉非常难求的样子

先把套路搞出来

\[f(n)=\sum_{i=1}^N\sum_{j=1}^M[(i,j)=n]
\]

\[F(n)=\sum_{i=1}^N\sum_{j=1}^M[n|(i,j)]=\sum_{n|d}f(d)=\left \lfloor \frac{N}{n} \right \rfloor\times\left \lfloor \frac{M}{n}\right \rfloor
\]

我们要求的是

\[Ans=\sum_{i=1}^Nf(i)σ(i)=\sum_{i=1}^Nσ(i)\sum_{i|d}\mu(\frac{d}{i})\left \lfloor \frac{N}{d} \right \rfloor\times\left \lfloor \frac{M}{d}\right \rfloor
\]

可以把\(d\)放到前面来枚举

\[Ans=\sum_{d=1}^N \left \lfloor \frac{N}{d} \right \rfloor\times\left \lfloor \frac{M}{d}\right \rfloor\sum_{i|d}\mu(\frac{d}{i})σ(i)
\]

我们发现后面就是\(σ\times \mu\)

非常显然

\[σ=I\times id
\]

两边卷上\(\mu\)

\[σ\times \mu=I\times \mu\times id=id
\]

所以如果只是求上面那个柿子甚至线筛都不用

但是有一个限制

\[σ(i)<=a
\]

我们得好好考虑一下了

首先由于是多组询问,我们可以直接离线掉,按照每组询问的\(a\)从小到大排序

之后把所有的数按照\(σ\)来排序

每次把所有的\(σ<=a\)的数加入进去,显然这个数加进去的时候会影响其所有倍数,同时我们整除分块的时候需要前缀和,于是这里用一个树状数组维护

之后就很好做了

代码

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#define re register
#define maxn 100005
#define uint long long
#define LL long long
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
#define lowbit(x) ((x)&(-x))
const LL mod=1ll<<31;
inline int read()
{
char c=getchar();
int x=0;
while(c<'0'||c>'9') c=getchar();
while(c>='0'&&c<='9') x=(x<<3)+(x<<1)+c-48,c=getchar();
return x;
} struct ASK
{
int n,m,rk,A;
uint ans;
}a[20005];
inline int cmp(ASK A,ASK B)
{
return A.A<B.A;
}
int mu[maxn],f[maxn],p[maxn>>1],pre[maxn],d[maxn];
int T,N;
struct Node
{
int num,p;
}b[maxn];
uint c[maxn];
uint Ans[maxn];
inline void add(int x,uint val){for(re int i=x;i<=N;i+=lowbit(i)) c[i]=(c[i]+val)%mod;}
inline uint ask(int x){uint cnt=0;for(re int i=x;i;i-=lowbit(i)) cnt=(cnt+c[i])%mod;return cnt;}
inline int cop(Node A,Node B)
{
return A.num<B.num;
}
void write(uint x)
{
if(x>9) write(x/10);
putchar(x%10+48);
}
int main()
{
T=read();
for(re int i=1;i<=T;i++) a[i].n=read(),a[i].m=read(),a[i].rk=i,scanf("%d",&a[i].A);
for(re int i=1;i<=T;i++) if(a[i].n>a[i].m) std::swap(a[i].n,a[i].m);
for(re int i=1;i<=T;i++) N=max(N,a[i].m);
std::sort(a+1,a+T+1,cmp);
f[1]=1,mu[1]=1;
for(re int i=2;i<=N;i++)
{
if(!f[i]) p[++p[0]]=i,mu[i]=-1;
for(re int j=1;j<=p[0]&&p[j]*i<=N;j++)
{
f[p[j]*i]=1;
if(i%p[j]==0) break;
mu[p[j]*i]=-1*mu[i];
}
}
for(re int i=1;i<=N;i++)
for(re int j=1;j*i<=N;j++) d[i*j]+=i;
for(re int i=1;i<=N;i++) b[i].p=i,b[i].num=d[i];
std::sort(b+1,b+N+1,cop);
int now=1;
for(re int i=1;i<=T;i++)
{
while(now<=N&&b[now].num<=a[i].A)
{
for(re int j=1;j*b[now].p<=N;j++) add(b[now].p*j,((b[now].num*mu[j])%mod+mod)%mod);
now++;
}
for(re uint l=1,r;l<=a[i].n;l=r+1)
{
r=min(a[i].n/(a[i].n/l),a[i].m/(a[i].m/l));
a[i].ans+=(uint)(a[i].n/l)%mod*(uint)(a[i].m/l)%mod*(ask(r)-ask(l-1)+mod)%mod;
a[i].ans%=mod;
}
Ans[a[i].rk]=a[i].ans;
}
for(re int i=1;i<=T;i++) write(Ans[i]),putchar(10);
return 0;
}

【[SDOI2014]数表】的更多相关文章

  1. BZOJ 3529: [Sdoi2014]数表 [莫比乌斯反演 树状数组]

    3529: [Sdoi2014]数表 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 1399  Solved: 694[Submit][Status] ...

  2. 【BZOJ 3529】 [Sdoi2014]数表 (莫比乌斯+分块+离线+树状数组)

    3529: [Sdoi2014]数表 Description 有一张N×m的数表,其第i行第j列(1 < =i < =礼,1 < =j < =m)的数值为能同时整除i和j的所有 ...

  3. BZOJ 3259 [Sdoi2014]数表 (莫比乌斯反演 + 树状数组)

    3529: [Sdoi2014]数表 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 2321  Solved: 1187[Submit][Status ...

  4. 洛咕3312 [SDOI2014]数表

    洛咕3312 [SDOI2014]数表 终于独立写出一道题了...真tm开心(还是先写完题解在写的) 先无视a的限制,设\(f[i]\)表示i的约数之和 不妨设\(n<m\) \(Ans=\su ...

  5. 【BZOJ3529】[Sdoi2014]数表 莫比乌斯反演+树状数组

    [BZOJ3529][Sdoi2014]数表 Description 有一张N×m的数表,其第i行第j列(1 < =i < =礼,1 < =j < =m)的数值为能同时整除i和 ...

  6. 洛谷 P3312 [SDOI2014]数表 解题报告

    P3312 [SDOI2014]数表 题目描述 有一张\(N*M\)的数表,其第\(i\)行第\(j\)列(\(1\le i \le n\),\(1 \le j \le m\))的数值为能同时整除\( ...

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

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

  8. BZOJ[Sdoi2014]数表 莫比乌斯反演

    [Sdoi2014]数表 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 2383  Solved: 1229[Submit][Status][Disc ...

  9. 洛谷P3312 - [SDOI2014]数表

    Portal Solution 共\(T(T\leq2\times10^4)\)组测试数据.给出\(n,m(n,m\leq10^5),a(a\leq10^9)\),求\[ \sum_{i=1}^n\s ...

  10. bzoj [SDOI2014]数表 莫比乌斯反演 BIT

    bzoj [SDOI2014]数表 莫比乌斯反演 BIT 链接 bzoj luogu loj 思路 \[ \sum\limits_{i=1}^{n}\sum\limits_{j=1}^{m}a*[f[ ...

随机推荐

  1. Java - 方法的参数声明

    给方法的参数加上限制是很常见的,比如参数代表索引时不能为负数.对于某个关键对象引用不能为null,否则会进行一些处理,比如抛出相应的异常信息. 对于这些参数限制,方法的提供者必须在文档中注明,并且在方 ...

  2. 前端(八):react入门

    React 特点:声明式设计.虚拟DOM.JSX.组件.数据驱动. 一.环境搭建 1.安装npm.cnpm # 安装node.js 从而安装npm,它会在当前用户家目录下生成node_moudules ...

  3. mysql中LOCATE和CASE WHEN...THEN...ELSE...END结合用法

    之前项目中需要写一个sql,就是查出某个调研详情中,选A答案,B答案,C答案...F答案的人各有多少人,这个sql也是费了很大的力气才写出来,故记下来,方便以后使用. 其中tbl_research_i ...

  4. ES6框架的搭建

    1.引入traceur.js  http://google.github.io/traceur-compiler/bin/traceur.js 2.将Traceur编译器用于网页 new traceu ...

  5. meta name id class 标签的区别

    meta https://zhidao.baidu.com/question/2052283721385566387.html name 跟 id 的区别 http://blog.csdn.net/f ...

  6. JS原生带小白点轮播图

    咱们刚刚说了js原生轮播图,现在给他加上可以随着一起走动的小圆点吧! css代码: *{ margin:0px; padding: 0px; } ul{ width: 2500px; height: ...

  7. python 增加矩阵行列和维数

    python 增加矩阵行列和维数 方法1 np.r_ np.c_ import numpy as np a = np.array([[1,2,3],[4,5,6],[7,8,9]]) b = np.a ...

  8. 对WebSocket技术的学习与探索(一)

    WebSocket 简要介绍 WebSocket protocol 是HTML5一种新的协议. 它实现了浏览器与服务器全双工通信(full-duple). 一开始的握手需要借助HTTP请求完成. We ...

  9. Java基础之基本数据类型的包装类型

    Java的基本数据类型的包装数据类型有多种: int Integer,short Short,boolean Boolean,float Float,double Double等等. Java包装类数 ...

  10. FileWriter与BufferedWriter的适用场景

    IO这块,各种Writer,Reader,让人眼晕 而在网上基本找不到在什么时候用哪个类,并且网上的IO demo 很多用法都是错的 在这简单的分析一下FileWriter与BufferedWrite ...