传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=4818
思路:
看到这道题我就想到当年noip模拟赛T1 是一个伪装的”很好”的辗转相除而我做了半天的悲惨经历。。感动的落泪。
首先注意到那个规则就是辗转相除,不过不是标准形式,化成标准形式后多迭代几次很容易发现性质:
f(a,b)=a∗bgcd(a,b)2∗f(gcd(a,b),gcd(a,b))f(a,b) = \frac{a * b}{gcd(a,b)^2} * f(gcd(a,b),gcd(a,b))
这个通过归纳法也很容易证明
这样ans = ∑ki=1∑kj=1f(i,j)\sum_{i = 1}^{k}\sum_{j = 1}^{k}f(i,j)
化简这个式子,注意到一个经典问题:
∑ni=1[(i,n)=1]i=n∗(φ+e)2\sum_{i=1}^{n}[(i,n) = 1]i = \frac{n * (\varphi + e) }{2}
利用这个我们的式子变成了:
∑ni=1f(i,i)∗g(⌊ni⌋)\sum_{i=1}^{n}f(i,i) * g(\lfloor\frac{n}{i} \rfloor)
其中g(n)=∑ni=1i∗i∗ϕ(i)g(n) = \sum_{i=1}^{n}i * i * \phi(i)
可以做到线性预处理gg
那么暴力维护修改的话就是套一个bit,明显T飞了。。。
到这里就非常像我bzoj 3529的做法了,一道披着数论外衣的数据结构狼?
注意到修改和查询是不均衡的,用序列分块就可以解决了,
这样就能做到O(1)O(1)查询,O(n√)修改O(\sqrt{n})修改,总的复杂度:O(m∗n√)O(m * \sqrt{n})
另外按bzoj 3529那个题的做法我们也可以用定期重构的分块解决这个问题,这不过这里因为nn很大的原因,重构次数不能太多,我估计在5次左右就可以了。。。应该也是可以通过的吧。
感觉自己基础差的要死。。。一开始连φ\varphi都筛错了半天没看出来,难怪滚粗呢QAQ

代码(分块):

#include<iostream>
#include<cstring>
#include<string>
#include<cstdio>
#include<cmath>
#define N 4000002
using namespace std;
typedef long long LL;
LL n,m,phi[N],g[N],now[N];
const LL P = 1000000007LL;inline void in(LL &x){char c;while (!isdigit(c = getchar()));x = (c ^ 48);while (isdigit(c = getchar())) x = 10 * x + (c ^ 48);}inline LL gcd(LL a,LL b){return (!b) ? (a) : gcd(b,a % b);}inline void inc(LL &x,LL y){x += y;if (x >= P) x -= P;}int cnt,prime[N];bool not_prime[N];inline void Sieve(){memset(not_prime,0,sizeof(not_prime));cnt = 0; phi[1] = 1;for (int i = 2;i <= n; ++i){if (!not_prime[i]) {prime[++cnt] = i;phi[i] = i - 1;}for (int j = 1;j <= cnt; ++j)if (prime[j] * i > n) break;else{not_prime[prime[j] * i] = 1;if (i % prime[j]) phi[i * prime[j]] = phi[i] * (prime[j] - 1);else{phi[i * prime[j]] = phi[i] * prime[j];break;}}}g[0] = 0;for (int i = 1;i <= n; ++i)g[i] = (g[i - 1] + 1LL * i * i % P * phi[i] % P) % P;}LL S[N];int num,belong[N],lb[N],rb[N],B;inline void Divide(){B = (int)(sqrt(n)) ;for (int i = 1;i <= n; ++i)belong[i] = (i - 1) / B + 1;belong[0] = belong[n + 1] = -1;for (int i = 1;i <= n; ++i){if (belong[i] != belong[i - 1]) lb[belong[i]] = i;if (belong[i] != belong[i + 1]) rb[belong[i]] = i;}num = belong[n];for (int i = 1;i <= num; ++i){int le = lb[i],re = rb[i];S[le] = now[le] % P;for (int j = le + 1;j <= re; ++j)S[j] = (S[j - 1] + now[j]) % P;}}inline void Pre(){for (int i = 1;i <= n; ++i) now[i] = 1LL * i * i;Sieve();Divide();}inline void init()
{in(m); in(n);Pre();
}inline void change(LL a,LL b,LL x,LL k){LL last,GCD = gcd(a,b),delta;last = now[GCD];now[GCD] = x / (a * b / (GCD * GCD));delta = (now[GCD] - last) % P;if (delta < 0) delta += P;int re = rb[belong[GCD]];for (int i = GCD;i <= re; ++i) inc(S[i],delta);}LL ans;inline LL GET(LL l,LL r){int ll = belong[l],rr = belong[r];LL Sum = 0;if (ll == rr){ if (l == lb[ll]) inc(Sum,S[r]);else inc(Sum,(S[r] - S[l - 1] + P) % P);return Sum;}Sum = S[r];if (l == lb[ll]) inc(Sum,S[rb[ll]]);else inc(Sum,(S[rb[ll]] - S[l - 1] + P) % P);for (int i = ll + 1;i < rr; ++i)inc(Sum,S[rb[i]]);return Sum; }inline void Query(LL a,LL b,LL x,LL k){ans = 0;for (int i = 1,j;i <= k;i = j + 1){j = k / (k / i);inc(ans,g[k / i] * GET(i,j) % P);}printf("%lld\n",ans);}LL a,b,x,k;
inline void DO_IT()
{for (int i = 1;i <= m; ++i){in(a); in(b); in(x); in(k);change(a,b,x,k);Query(a,b,x,k);}
}int main()
{init();DO_IT();return 0;
}

bzoj 4815: [Cqoi2017]小Q的表格相关推荐

  1. P3700 [CQOI2017]小Q的表格(反演、分块)

    P3700 [CQOI2017]小Q的表格 给定一个大小为n×nn \times nn×n的表格,初始时i,ji, ji,j位置上填的是f(i,j)=i×jf(i, j) = i \times jf( ...

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

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

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

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

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

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

  5. bzoj 4814: [Cqoi2017]小Q的草稿【计算几何】

    //先打个50暴力,10min50分简直美滋滋~ #include<iostream> #include<cstdio> #include<algorithm> u ...

  6. [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 ...

  7. BZOJ 4813: [Cqoi2017]小Q的棋盘 (树形dp)

    题目传送门 Solution 树形背包dp大水题,是POJ某道题的弱化版...不想说了,据说贪心也能过此题.. 一开始50分,dp数组初始化炸了,表示无语.. Code #include <io ...

  8. 【CQOI2017】小Q的表格

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

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

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

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

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

最新文章

  1. 他们让云撸猫变成现实,台湾大学开发手持VR设备解救吸猫人
  2. socket.io笔记
  3. git add . 出现错误 The file will have its original line endings in your working directory. 解决方案...
  4. C#中使用JavaScriptSerializer类实现序列化与反序列化
  5. asp.net JavaScriptSerializer实现序列化和反序列化
  6. Mysql学习总结(23)——MySQL统计函数和分组查询
  7. Openwrt 软件安装源
  8. 【EMNLP2020】一种多层对多层的BERT蒸馏方法
  9. JS面向对象方法(二) 面向对象方法实现橱窗式图面预览以及放大功能
  10. python:TKinter获取Text文本框的输入内容(python图形化界面)
  11. 字符集本地化(locale)与输入法系列讲座-----(1) UTF-8 and Unicode FAQ
  12. Markdown、.bib、LaTeX + Typora、Pandoc 管理论文参考文献
  13. 身份证真伪辨别 Python
  14. Spark集群环境搭建+Maven、SBT编译部署+IDEA开发(一)
  15. 天津大学计算机专硕_天津大学计算机学院学硕和专硕哪个好?
  16. 线性回归正则化 regularized linear regression
  17. pythonarray什么意思_python:array([...])是什么意思?(python: what does array([…]) mean?)...
  18. 如何在Unity中制作VR全景动画
  19. 【Matlab心音信号】EMD心音信号特征提取【含GUI源码 1735期】
  20. java的rest教程_[Java教程]SpringMVC的REST风格的四种请求方式

热门文章

  1. JavaScript页面刷新的所有方法
  2. 如何在Google地图上找到经度和纬度
  3. HG221GS光猫超级密码破解(烽火,华为)
  4. 网络与信息安全应急处置预案
  5. Java人事管理系统设计
  6. E盾网络验证企业版个人版离线版易语言源码加密对接好的自绘界面1
  7. 钢结构工程管理软件系统
  8. 报错 OSError: CUDA_HOME environment variable is not set. Please set it to your CUDA install root.
  9. 怎么把一张暗的照片调亮_美图秀秀教你批量将偏暗的照片提亮
  10. 一个放在口袋里的项目,将社交裂变做到了极致