题目链接

BZOJ4815

题解

根据题中的式子,手玩一下发现和\(gcd\)很像

化一下式子:

\[\begin{aligned}
bf(a,a + b) &= (a + b)f(a,b) \\
\frac{f(a,a + b)}{a + b} &= \frac{f(a,b)}{b} \\
\frac{f(a,a + b)}{a(a + b)} &= \frac{f(a,b)}{ab} \\
\frac{f(a,b)}{ab} &= \frac{f(d,d)}{d^2} \\
\end{aligned}
\]

其中\(d = gcd(a,b)\)

那么我们有

\[\begin{aligned}
ans &= \sum\limits_{i = 1}^{k} \sum\limits_{j = 1}^{k} f(i,j) \\
&= \sum\limits_{d = 1}^{k} f(d,d) \sum\limits_{d|i} \sum\limits_{d|j} \frac{ij}{d^2} \quad [gcd(i,j) == d] \\
&= \sum\limits_{d = 1}^{k} f(d,d) \sum\limits_{i = 1}^{\lfloor \frac{k}{d} \rfloor} \sum\limits_{j = 1}^{\lfloor \frac{k}{d} \rfloor} ij \quad [i \perp j] \\
\end{aligned}
\]

\[g(n) = \sum\limits_{i = 1}^{n} \sum\limits_{j = 1}^{n} ij \quad [i \perp j]
\]

由于

\[\sum\limits_{i = 1}^{n} i \quad [i \perp n] = \frac{n\varphi(n)}{2}
\]

所以

\[\begin{aligned}
g(n) &= \sum\limits_{i = 1}^{n} i \times 2 \times \frac{i\varphi(i)}{2} \\
&= \sum\limits_{i = 1}^{n} i^2\varphi(i) \\
\end{aligned}
\]

我们可以线性筛\(O(n)\)预处理出\(g(n)\)

对于答案的式子,可以\(O(\sqrt{k})\)整除分块

所以我们只需要\(O(1)\)计算\(f(d,d)\)的前缀和

分块即可

块外维护块的前缀和,块内维护块内前缀和

这样修改是\(O(\sqrt{n})\)的,修改复杂度\(O(m\sqrt{n})\)

且询问时\(O(1)\)的

总复杂度\(O(m\sqrt{n})\)

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<map>
#define Redge(u) for (int k = h[u],to; k; k = ed[k].nxt)
#define REP(i,n) for (int i = 1; i <= (n); i++)
#define mp(a,b) make_pair<int,int>(a,b)
#define cls(s) memset(s,0,sizeof(s))
#define cp pair<int,int>
#define LL long long int
using namespace std;
const int maxn = 4000005,maxm = 400005,INF = 1000000000,P = 1000000007;
inline LL read(){
LL out = 0,flag = 1; char c = getchar();
while (c < 48 || c > 57){if (c == '-') flag = -1; c = getchar();}
while (c >= 48 && c <= 57){out = (out << 3) + (out << 1) + c - 48; c = getchar();}
return out * flag;
}
int m,n,sum[maxn],S[maxn],b[maxn],L[maxn],R[maxn],bi,B;
inline void modify(int u,int x){
int v = x % P;
if (u == L[b[u]]) v = ((v - S[u]) % P + P) % P;
else v = ((v - (S[u] - S[u - 1]) % P) % P + P) % P;
v = (v + P) % P;
for (int i = u; i <= R[b[u]]; i++)
S[i] = (S[i] + v) % P;
for (int i = b[u]; i <= bi; i++)
sum[i] = (sum[i] + v) % P;
}
inline int query(int u){
if (!u) return 0;
return (S[u] + sum[b[u] - 1]) % P;
}
int p[maxn],pi,isn[maxn],phi[maxn],g[maxn],val[maxn];
void init(){
phi[1] = 1;
for (register int i = 2; i <= n; i++){
if (!isn[i]) p[++pi] = i,phi[i] = i - 1;
for (int j = 1; j <= pi && i * p[j] <= n; j++){
isn[i * p[j]] = true;
if (i % p[j] == 0){
phi[i * p[j]] = phi[i] * p[j];
break;
}
phi[i * p[j]] = phi[i] * (p[j] - 1);
}
}
for (register int i = 1; i <= n; i++)
g[i] = (g[i - 1] + 1ll * val[i] * phi[i] % P) % P;
}
LL gcd(LL a,LL b){return b ? gcd(b,a % b) : a;}
int main(){
m = read(); n = read(); B = (int)sqrt(n) + 1;
for (register int i = 1; i <= n; i++){
b[i] = i / B + 1; val[i] = 1ll * i * i % P;
if (b[i] != b[i - 1]) R[b[i - 1]] = i - 1,L[b[i]] = i;
sum[b[i]] = (sum[b[i]] + val[i]) % P;
if (i != L[b[i]]) S[i] = S[i - 1];
S[i] = (S[i] + val[i]) % P;
}
R[b[n]] = n; bi = b[n];
for (register int i = 1; i <= bi; i++)
sum[i] = (sum[i] + sum[i - 1]) % P;
init();
LL a,b,x,k,d,ans;
while (m--){
a = read(); b = read(); x = read(); k = read();
d = gcd(a,b); x /= (a / d) * (b / d); x %= P;
modify(d,x);
ans = 0;
for (int i = 1,nxt; i <= k; i = nxt + 1){
nxt = k / (k / i);
ans = (ans + 1ll * (query(nxt) - query(i - 1)) % P * g[k / i] % P) % P;
}
printf("%lld\n",(ans % P + P) % P);
}
return 0;
}

BZOJ4815 [CQOI2017]小Q的表格 【数论 + 分块】的更多相关文章

  1. [BZOJ4815][CQOI2017]小Q的表格 数论+分块

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=4815 题目中所给条件中的$(a,a+b)$和$(a,b)$的关系很瞩目. 然后大家都知道$ ...

  2. [CQOI2017]小Q的表格(数论+分块)

    题目描述 小Q是个程序员. 作为一个年轻的程序员,小Q总是被老C欺负,老C经常把一些麻烦的任务交给小Q来处理.每当小Q不知道如何解决时,就只好向你求助. 为了完成任务,小Q需要列一个表格,表格有无穷多 ...

  3. [BZOJ4815][CQOI2017]小Q的表格(莫比乌斯反演)

    4815: [Cqoi2017]小Q的表格 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 832  Solved: 342[Submit][Statu ...

  4. bzoj 4815: [Cqoi2017]小Q的表格 [数论]

    4815: [Cqoi2017]小Q的表格 题意: 单点修改,查询前缀正方形和.修改后要求满足条件f(a,b)=f(b,a), b×f(a,a+b)=(a+b)*f(a,b) 一开始sb了认为一次只会 ...

  5. [bzoj4815]: [Cqoi2017]小Q的表格

    来自FallDream的博客,未经允许,请勿转载,谢谢. 小Q是个程序员. 作为一个年轻的程序员,小Q总是被老C欺负,老C经常把一些麻烦的任务交给小Q来处理.每当小Q不知道如何解决时,就只好向你求助. ...

  6. bzoj 4815 [Cqoi2017]小Q的表格——反演+分块

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4815 大概就是推式子的时候注意有两个边界都是 n ,考虑变成 2*... 之类的. 分块维护 ...

  7. 【BZOJ4815】[CQOI2017]小Q的表格(莫比乌斯反演,分块)

    [BZOJ4815][CQOI2017]小Q的表格(莫比乌斯反演,分块) 题面 BZOJ 洛谷 题解 神仙题啊. 首先\(f(a,b)=f(b,a)\)告诉我们矩阵只要算一半就好了. 接下来是\(b* ...

  8. 洛咕 P3700 [CQOI2017]小Q的表格

    洛咕 P3700 [CQOI2017]小Q的表格 神仙题orz 首先推一下给的两个式子中的第二个 \(b\cdot F(a,a+b)=(a+b)\cdot F(a,b)\) 先简单的想,\(F(a,a ...

  9. [bzoj4815] [洛谷P3700] [Cqoi2017] 小Q的表格

    Description 小Q是个程序员. 作为一个年轻的程序员,小Q总是被老C欺负,老C经常把一些麻烦的任务交给小Q来处理. 每当小Q不知道如何解决时,就只好向你求助.为了完成任务,小Q需要列一个表格 ...

随机推荐

  1. python中的class正确用法

    class Dog: def __init__(self, name): self.name = name self.tricks = [] # creates a new empty list fo ...

  2. appium -- 页面出现弹窗,关闭后,无法识别页面元素

    1. 问题:如图所示:在修改手势密码的过程中,点击了返回按钮后,弹出该弹窗:点击继续设置后,就发现 driver.getPageSource()获取不到页面元素.在找了一圈无用的资料后,没有什么好的处 ...

  3. java学习笔记-8.对象的容纳

    1.Iterator(迭代器)和Enumeration(枚举类),都是用来遍历集合的,他们都是接口.区别是Enumeration只能读取集合的数据,而Iterator可以对数据进行删除,Iterato ...

  4. MyBatis 注解配置及动态SQL

      一.注解配置 目前MyBatis支持注解配置,用注解方式来替代映射文件,但是注解配置还是有点不完善,在开发中使用比较少,大部分的企业还是在用映射文件来进行配置.不完善的地方体现在于当数据表中的字段 ...

  5. SpringBoot在IDEA下使用JPA

    1依赖 使用IDEA构建基于JPA的项目需要引用JPA.MYSQL依赖 2配置文件修改 2.1连接库 spring.datasource.url=jdbc:mysql://localhost:3306 ...

  6. Error: Could not find or load main class org.apache.hadoop.mapreduce.v2.app.MRAppMaster

    自己搭建了一套伪分布的大数据环境,运行Hadoop包中自带的示例时,出现如下错误: 错误: 找不到或无法加载主类 org.apache.hadoop.mapreduce.v2.app.MRAppMas ...

  7. c# winform 服务器提交了协议冲突. Section=ResponseStatusLine

    [转] 最近在用.net写一个网络蜘蛛,发现对有的网站用HttpWebrequest抓取网页的时候会报错,捕获异常提示:"服务器提交了协议冲突 Section=ResponseStatusL ...

  8. 最小生成树(Kruskal和Prim算法)

    关于图的几个概念定义:          关于图的几个概念定义: 连通图:在无向图中,若任意两个顶点vi与vj都有路径相通,则称该无向图为连通图. 强连通图:在有向图中,若任意两个顶点vi与vj都有路 ...

  9. Alpha发布——Thunder团队

    视频展示 视频链接: 爱奇艺: http://www.iqiyi.com/w_19ruzwru25.html      (画质清晰,但可能需多次刷新或重新打开页面,此问题因电脑型号和网络而异) 优酷: ...

  10. lintcode-167-链表求和

    167-链表求和 你有两个用链表代表的整数,其中每个节点包含一个数字.数字存储按照在原来整数中相反的顺序,使得第一个数字位于链表的开头.写出一个函数将两个整数相加,用链表形式返回和. 样例 给出两个链 ...