P3700 [CQOI2017]小Q的表格

给定一个大小为n×nn \times nn×n的表格,初始时i,ji, ji,j位置上填的是f(i,j)=i×jf(i, j) = i \times jf(i,j)=i×j,有mmm个操作,每次操作给定a,b,x,ka, b, x, ka,b,x,k,把格子a,ba, ba,b上的值改成xxx,求∑i=1k∑j=1kf(i,j)\sum\limits_{i = 1} ^{k} \sum\limits_{j = 1} ^{k} f(i, j)i=1∑k​j=1∑k​f(i,j)。

我们定义,在任何时刻,表格里的值都满足f(i,j)=f(j,i),j×f(i,i+j)=(i+j)×f(i,j)f(i, j) = f(j, i), j \times f(i, i + j) = (i + j) \times f(i, j)f(i,j)=f(j,i),j×f(i,i+j)=(i+j)×f(i,j)。
b×f(a,a+b)=(a+b)×f(a,b)f(a,a+b)a×(a+b)=f(a,b)a×bf(a,b)a×b=f(b,a%b)b×a%bf(a,b)a×b=f(d,d)d×d,d=gcd⁡(a,b)f(a,b)=a×bd×df(d,d)b \times f(a, a + b) = (a + b) \times f(a, b)\\ \frac{f(a, a + b)}{a \times (a + b)} = \frac{f(a, b)}{a \times b}\\ \frac{f(a, b)}{a \times b} = \frac{f(b, a\ \%\ b)}{b \times a\ \%\ b}\\ \frac{f(a, b)}{a \times b} = \frac{f(d, d)}{d \times d}, d = \gcd(a, b)\\ f(a, b) = \frac{a \times b}{d \times d} f(d, d)\\ b×f(a,a+b)=(a+b)×f(a,b)a×(a+b)f(a,a+b)​=a×bf(a,b)​a×bf(a,b)​=b×a % bf(b,a % b)​a×bf(a,b)​=d×df(d,d)​,d=gcd(a,b)f(a,b)=d×da×b​f(d,d)

考虑统计答案:
∑i=1n∑j=1nf(i,j)∑d=1nf(d,d)∑i=1nd∑j=1ndij[gcd⁡(i,j)=1]∑d=1nf(d,d)(∑i=1ndi∑j=1ij[gcd⁡(i,j)−1]−1)∑d=1nf(d,d)∑i=1ndi2ϕ(i)g(n)=∑i=1ni2×ϕ(i)\sum_{i = 1} ^{n} \sum_{j = 1} ^{n} f(i, j)\\ \sum_{d = 1} ^{n} f(d, d) \sum_{i = 1} ^{\frac{n}{d}} \sum_{j = 1} ^{\frac{n}{d}} ij[\gcd(i, j) = 1]\\ \sum_{d = 1} ^{n} f(d, d) \left(\sum_{i = 1} ^{\frac{n}{d}} i \sum_{j = 1} ^{i} j[\gcd(i, j) - 1] - 1\right)\\ \sum_{d = 1} ^{n} f(d, d) \sum_{i = 1} ^{\frac{n}{d}} i ^ 2 \phi(i)\\ g(n) = \sum_{i = 1} ^{n} i ^ 2 \times \phi(i)\\ i=1∑n​j=1∑n​f(i,j)d=1∑n​f(d,d)i=1∑dn​​j=1∑dn​​ij[gcd(i,j)=1]d=1∑n​f(d,d)⎝⎛​i=1∑dn​​ij=1∑i​j[gcd(i,j)−1]−1⎠⎞​d=1∑n​f(d,d)i=1∑dn​​i2ϕ(i)g(n)=i=1∑n​i2×ϕ(i)
容易发现g(n)g(n)g(n)可以线性筛得到,所以我们只要动态维护f(d,d)f(d, d)f(d,d)的前缀和即可,考虑用分块维护前缀和,满足n\sqrt nn​修改,O(1)O(1)O(1)查询。

#include <bits/stdc++.h>using namespace std;const int N = 4e6 + 10, mod = 1e9 + 7;int prime[N], phi[N], g[N], f[N], cnt, n, m;int L[N], R[N], id[N], sum[N], lazy[N], block, blocks;bool st[N];inline int add(int x, int y) {return x + y < mod ? x + y : x + y - mod;
}inline int sub(int x, int y) {return x >= y ? x - y : x - y + mod;
}void init() {phi[1] = 1;for (int i = 2; i < N; i++) {if (!st[i]) {prime[++cnt] = i;phi[i] = i - 1;}for (int j = 1; j <= cnt && 1ll * i * prime[j] < N; j++) {st[i * prime[j]] = 1;if (i % prime[j] == 0) {phi[i * prime[j]] = phi[i] * prime[j];break;}phi[i * prime[j]] = phi[i] * (prime[j] - 1);}}for (int i = 1; i < N; i++) {g[i] = add(g[i - 1], 1ll * i * i % mod * phi[i] % mod);f[i] = 1ll * i * i % mod, sum[i] = add(sum[i - 1], f[i]);}block = sqrt(n);for (int i = 1; i <= n; i += block) {L[++blocks] = i, R[blocks] = min(i + block - 1, n);for (int j = L[blocks]; j <= R[blocks]; j++) {id[j] = blocks;}}
}inline int query(int x) {return add(sum[x], lazy[id[x]]);
}inline void update(int x, int v) {int pos = id[x];for (int i = x; i <= R[pos]; i++) {sum[i] = add(sum[i], v);}pos++;while (pos <= blocks) {lazy[pos] = add(lazy[pos], v);pos++;}
}int main() {// freopen("in.txt", "r", stdin);// freopen("out.txt", "w", stdout);scanf("%d %d", &m, &n);init();for (int cas = 1, a, b, k; cas <= m; cas++) {long long x;scanf("%d %d %lld %d", &a, &b, &x, &k);int p = __gcd(a, b);update(p, sub(0, f[p]));f[p] = (x / (a / p)) / (b / p) % mod;update(p, f[p]);int ans = 0;for (int l = 1, r; l <= k; l = r + 1) {r = k / (k / l);ans = add(ans, 1ll * g[k / l] * sub(query(r), query(l - 1)) % mod);}printf("%d\n", ans);}return 0;
}

P3700 [CQOI2017]小Q的表格(反演、分块)相关推荐

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

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

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

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

  3. [CQOI2017] 小Q的表格(分块 + 整除分块 + 数学 + 前缀和)

    problem luogu-P3700 solution f(a,b)=f(b,a)f(a,b)=f(b,a)f(a,b)=f(b,a) 意味着我们只用考虑半个棋盘的信息. b∗f(a,a+b)=(a ...

  4. P3700-[CQOI2017]小Q的表格【分块,欧拉函数】

    正题 题目链接:https://www.luogu.com.cn/problem/P3700 题目大意 一个n∗nn*nn∗n个数的数字表格,开始位置(a,b)(a,b)(a,b)上的是a∗ba*ba ...

  5. 【CQOI2017】小Q的表格

    [CQOI2017]小Q的表格 稍加推导就会发现\(f(a,b)=a\cdot b\cdot h(gcd(a,b))\). 初始时\(h(n)=1\). 询问前\(k\)行\(k\)列时我们就反演: ...

  6. [bzoj4813][Cqoi2017]小Q的棋盘

    来自FallDream的博客,未经允许,请勿转载,谢谢. 小Q正在设计一种棋类游戏.在小Q设计的游戏中,棋子可以放在棋盘上的格点中.某些格点之间有连线,棋子只能在有连线的格点之间移动.整个棋盘上共有V ...

  7. 【CQOI2017】bzoj4815 小Q的表格

    根据辗转相减可以知道,相互影响的就是 gcd \gcd相同的那些数.又根据条件 2 2可以知道,所有gcd\gcd相同的数的比例是不会改变的,又因为最开始 a(x,y)=xy a(x,y)=xy是一组 ...

  8. BZOJ 4814 Luogu P3699 [CQOI2017]小Q的草稿 (计算几何、扫描线、set)

    题目链接 (BZOJ) http://lydsy.com/JudgeOnline/problem.php?id=4814 (Luogu) https://www.luogu.org/problem/P ...

  9. bzoj 4813: [Cqoi2017]小Q的棋盘【树形dp】

    这么简单的dp我怎么没想到x2 f为从这个点出发后回到这个点最多能走过的点,g为从这个点出发后不回到这个点最多能走过的点,注意g有两种转移:g[u][k]=max(g[u][k],f[u][k-j-1 ...

最新文章

  1. Android事件分发机制详解
  2. 教 Chatbot 生成更有营养的对话
  3. mongoengine.NotUniqueError
  4. android虚拟电话号码,为何安卓手机坚持虚拟按键?这才是原因
  5. plotplay恢复默认设置_手把手解答win10系统potplayer经常弹出自动更新提示的还原技巧...
  6. 怎么捡自己空投_“吃鸡”里信号枪子弹可以复制?玩家发现神秘技巧,空投捡到手软...
  7. android 程序 共享文件,026 Android多进程-文件共享
  8. 计算机音乐叫什么名字,电脑开机那段美妙的音乐叫什么名字?
  9. VmBox硬盘容量调整
  10. 联通实时计算平台演进与实践
  11. cmd 下通过NTML代理访问Maven 库
  12. 微型计算机控制技术小论文,微型计算机控制技术结课论文..doc
  13. excel打开超链接不使用浏览器,使用默认图片浏览软件
  14. 学习笔记-支付宝支付
  15. STM32J-LINK下载教程
  16. 【Java接口】限制App登录次数
  17. SpringSecurity的旅途(喜欢的话,可以点个赞哦~)
  18. 【蓝桥杯真题】 (一) 递归与递推 (Acwing 蓝桥杯 笔记)
  19. BUCK启动和停止工作的波形
  20. 年薪 30W 和 60W,数据分析师的两道坎

热门文章

  1. 每日一笑 | 马冬梅当上了百度投资董事???
  2. 惊呆了!竟然还有这样的操作!
  3. 兄弟机cnc系统面板图解_FANUC软操作面板的应用介绍,真的太详细了
  4. 计算机老师开场白试讲视频,教师招考试讲模版之开场白
  5. mysql高级查询 二_MySQL高级查询(二)
  6. 华硕路由器 linux上不了网,华硕ASUS路由器连不上网怎么办?
  7. php mysql explain_MySQL Explain详解
  8. linux基础 linhaifeng,Linux基础之命令练习Day2(示例代码)
  9. linux把终端嵌入桌面,在Ubuntu Linux桌面上嵌入终端窗口
  10. android.mk 翻译,翻译ANDROID-MK.TXT