题目

神仙题,神仙题

这是一道很适合盯着发呆的题目

看到这个规律

\[f(a,b)=f(b,a)
\]

\[b\times f(a,a+b)=(a+b)\times f(a,b)
\]

这也没什么规律啊

于是自闭了

盯着发呆一个小时之后发现,这个\(f(a,a+b)\)和\(f(a,b)\)有关系

因为修改\((a,b)\)就一定会影响\((a,a+b)\),同时也会影响\((a,a+2b)...\)

\[gcd(a,a+b)=gcd(a+b,a)=gcd(a,a+b-a)=gcd(a,b)
\]

这不是更相减损术吗

于是我们得出了第一个结论

修改\(a,b\)这个值只会影响\(gcd(x,y)=gcd(a,b)\)的\(f(x,y)\)的值

但是这样我们还是没有什么办法来维护啊,毕竟矩阵那么大,我们修改一次影响的数那么多

我们大胆猜想格子的值存在某种关系,如果\(gcd(a,b)=d\),那么\(f(a,b)\)肯定和\(f(d,d)\)存在某种关系

尝试去求一下这个关系

\[f(d,d)\times 2d=f(d,2d)\times d
\]

\[f(d,2d)\times 3d=f(d,3d)\times 2d
\]

显然\(f(d,kd)=\frac{k}{(k-1)}f(d,(k-1)d)=k\times f(d,kd)\)

显然纵坐标也会有这样的性质

于是\(f(k_1d,k_2d),k_1\perp k_2\),就会有\(k_1\times k_2\times f(d,d)=f(k_1d,k_2d)\)

其实也就是这样

\[f(a,b)=\frac{a\times b}{(a,b)^2}f((a,b),(a,b))
\]

考虑把\(f(a,b)\)写成\(\frac{ab}{d^2}f(d,d)\)

于是我们只需要记录\(f(d,d)\)的值了,这样就可以处理修改操作了

接下来把\(f(d,d)\)简记做\(f(d)\)

现在我们要求的柿子是

\[\sum_{i=1}^n\sum_{j=1}^n\frac{i\times j}{(i,j)^2}f((i,j))
\]

考虑一下枚举\(gcd\)

\[\sum_{d=1}^nf(d)\sum_{i=1}^{\left \lfloor \frac{n}{d} \right \rfloor}\sum_{j=1}^{\left \lfloor \frac{n}{d} \right \rfloor}[(i,j)=1]i\times j
\]

那个除以\((i,j)^2\)消失了是因为我们后面乘上的是\(i,j\),本来就是都除以\(d\)了的

之后只要记住一条,千万别反演就好了

我们能通过欧拉函数把上面的柿子写成这个样子

\[\sum_{d=1}^nf(d)\sum_{i=1}^{\left \lfloor \frac{n}{d} \right \rfloor}i^2\varphi(i)
\]

至于为什么,我们需要这个柿子

\[\sum_{i=1}^n[(i,n)=1]i=\frac{n\varphi(n)+[n=1]}{2}
\]

至于这个柿子这么来的,我们证明一下

\[\sum_{i=1}^n[(i,n)=1]i=\sum_{i=1}^ni\sum_{d|i,d|n}\mu(d)
\]

交换一下求和符号

\[=\sum_{d|n}\mu(d)\sum_{d|i}i=\sum_{d|n}\mu(d)\sum_{i=1}^{\frac{n}{d}}i\times d
\]

\[=\sum_{d|n}\mu(d)d\sum_{i=1}^{\frac{n}{d}}i=\sum_{d|n}\mu(d)d\frac{(\frac{n}{d}+1)\frac{n}{d}}{2}
\]

\[=\frac{n}{2}\sum_{d|n}\mu(d)(\frac{n}{d}+1)=\frac{n}{2}(n\sum_{d|n}\frac{\mu(d)}{d}+\sum_{d|n}\mu(d))
\]

我们现在需要两条很基础的结论

\[\sum_{d|n}\mu(d)=[n=1],\sum_{d|n}\frac{\mu(d)}{d}=\frac{\varphi(n)}{n}
\]

这里就不再证明了

根据上面那条结论我们有

\[\sum_{i=1}^n\sum_{j=1}^n[(i,j)=1]i\times j=\sum_{i=1}^ni^2\times \varphi(i)
\]

我们设\(S(n)=\sum_{i=1}^ni^2\times \varphi(i)\)

答案就是

\[\sum_{i=1}^nS(\left \lfloor \frac{n}{d} \right \rfloor)f(d)
\]

我们现在就可以尽情的整除分块了

但是由于\(f\)需要支持修改我们还要查询前缀和,于是看起来有点自闭,因为树状数组的复杂度高达\(O(m\sqrt{n}logn)\),好像不是很科学

但是修改却快的一批,低到\(O(mlogn)\),考虑一个神奇的数据结构,可以做到\(O(1)\)单点求和

自然是神奇的分块了,我们直接把\(f\)做成前缀和,单点修改我们直接搞成区间修改,之后我们单点查询前缀和就可以很快了

代码

  1. #include<cmath>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<iostream>
  5. #include<algorithm>
  6. #define re register
  7. #define LL long long
  8. #define max(a,b) ((a)>(b)?(a):(b))
  9. #define min(a,b) ((a)<(b)?(a):(b))
  10. const int maxn=4e6+5;
  11. const LL mod=1e9+7;
  12. inline int gcd(int a,int b) {return !b?a:gcd(b,a%b);}
  13. inline LL read() {
  14. char c=getchar();LL x=0;while(c<'0'||c>'9') c=getchar();
  15. while(c>='0'&&c<='9') x=(x<<3)+(x<<1)+c-48,c=getchar();return x;
  16. }
  17. int f[maxn],p[maxn>>1];
  18. LL phi[maxn],pre[maxn],F[maxn];
  19. int n,m;
  20. struct Block {
  21. int sz,tot;
  22. int l[3005],r[3005],id[maxn];
  23. LL tag[3005];
  24. inline void Build() {
  25. sz=std::sqrt(n);
  26. for(re int i=1;i<=n;i+=sz) {
  27. l[++tot]=i,r[tot]=min(i+sz-1,n);
  28. for(re int j=l[tot];j<=r[tot];j++) id[j]=tot;
  29. }
  30. }
  31. inline LL ask(int x) {return (pre[x]+tag[id[x]])%mod;}
  32. inline void change(int x,LL val) {
  33. int j=id[x];
  34. if(x==l[j]) tag[j]+=val,tag[j]=(tag[j]+mod)%mod;
  35. else for(re int i=x;i<=r[j];i++) pre[i]=(pre[i]+val+mod)%mod;
  36. j++;while(j<=tot) tag[j]+=val,tag[j]=(tag[j]+mod)%mod,j++;
  37. }
  38. }B;
  39. int main() {
  40. m=read(),n=read();
  41. phi[1]=1;
  42. for(re int i=2;i<=n;i++) {
  43. if(!f[i]) p[++p[0]]=i,phi[i]=i-1;
  44. for(re int j=1;j<=p[0]&&p[j]*i<=n;j++) {
  45. f[p[j]*i]=1;
  46. if(i%p[j]==0) {phi[p[j]*i]=p[j]*phi[i];break;}
  47. phi[p[j]*i]=phi[p[j]]*phi[i];
  48. }
  49. }
  50. for(re LL i=1;i<=n;i++) phi[i]=phi[i-1]+i*i%mod*phi[i]%mod,phi[i]%=mod;
  51. for(re LL i=1;i<=n;i++) F[i]=(i*i)%mod;
  52. for(re int i=1;i<=n;i++) pre[i]=pre[i-1]+F[i],pre[i]%=mod;
  53. B.Build();
  54. int a,b,k;LL v;
  55. while(m--) {
  56. a=read(),b=read(),v=read(),k=read();
  57. int t=gcd(a,b);LL ans=0;
  58. B.change(t,-1ll*F[t]);
  59. F[t]=v/((LL)(a/t)*(LL)(b/t));
  60. B.change(t,F[t]);
  61. for(re int l=1,r;l<=k;l=r+1) {
  62. r=k/(k/l);
  63. ans+=phi[k/l]*(B.ask(r)-B.ask(l-1)+mod)%mod,ans%=mod;
  64. }
  65. printf("%lld\n",ans);
  66. }
  67. return 0;
  68. }

[CQOI2017]小Q的表格的更多相关文章

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  8. bzoj 4815: [Cqoi2017]小Q的表格【欧拉函数+分块】

    参考:http://blog.csdn.net/qq_33229466/article/details/70174227 看这个等式的形式就像高精gcd嘛-所以随便算一下就发现每次修改(a,b)影响到 ...

  9. BZOJ 4815 CQOI2017 小Q的表格 欧拉函数+分块

    题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=4815 题意概述:要认真概述的话这个题就出来了... 分析: 首先分析题目,认真研究一下修 ...

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

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

随机推荐

  1. 撩课-Web大前端每天5道面试题-Day2

    1.伪类与伪元素的区别? 1) 定义区别 伪类 伪类用于选择DOM树之外的信息,或是不能用简单选择器进行表示的信息. 前者包含那些匹配指定状态的元素,比如:visited,:active:后者包含那些 ...

  2. 基于.Net下整合FastReport,实现条码标签批量打印

    一. 准备工作 1. 点击此下载支持.Net4.0的 FastReport ,安装后并破解 2. VS2012 工具箱中,新建选项卡,添加 %安装目录%\Framework 4.0\FastRepor ...

  3. 2.springioc实例化bean的三个方法

    1.构造器 也就是在上一篇讲的那个例子,调用默认的无参构造函数 2.静态工厂方法 1)创建需要执行的方法的类 public class HelloWorld { public HelloWorld() ...

  4. Spring Data JPA —— 快速入门

    一.概述 JPA : Java Persistence API, Java持久层API,是JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中. Spring D ...

  5. UNIX IPC: POSIX 消息队列 与 信号

    POSIX消息队列可以注册空队列有消息到达时所触发的信号,而信号触发对应的信号处理函数. 下面是一份基本的消息队列和信号处理结合的代码(修改自UNIX网络编程:进程间通信) #include < ...

  6. input textarea监听鼠标粘贴

    发现一个问题,在input/textarea中如果是鼠标粘贴内容进去,发现判断不了value的改变,html代码如下: <!doctype html> <html> <h ...

  7. BZOJ5068: 友好的生物(状压 贪心)

    题意 题目链接 Sol 又是一道神仙题??.. 把绝对值拆开之后状压前面的符号?.. 下界显然,但是上界为啥是对的呀qwq.. #include<bits/stdc++.h> using ...

  8. let 和 var 区别

    javascript 严格模式 第一次接触let关键字,有一个要非常非常要注意的概念就是”javascript 严格模式”,比如下述的代码运行就会报错: <Javascript 严格模式详解&g ...

  9. javascript变量的引用类型值

    JavaScript变量可以用来保存俩种类型的值:基本类型和引用类型值 前言 JS变量可以用来保存两种类型的值:基本类型值和引用类型值.基本类型的值源自一下5种基本数据类型:Underfined.Nu ...

  10. 微信小程序-02-项目文件之间配合和调用关系

    微信小程序-02-项目文件之间配合和调用关系 我就不说那么多了,我是从官方文档拷贝的,然后加上一些自己的笔记,不喜勿喷 官方文档:https://developers.weixin.qq.com/mi ...