正题

题目链接:https://www.luogu.com.cn/problem/P3700


题目大意

一个n∗nn*nn∗n个数的数字表格,开始位置(a,b)(a,b)(a,b)上的是a∗ba*ba∗b。数字表格需满足以下条件

  1. 对于任意(a,b)(a,b)(a,b)有f(a,b)=f(b,a)f(a,b)=f(b,a)f(a,b)=f(b,a)
  2. 对于任意(a,b)(a,b)(a,b)有b∗f(a,a+b)=(a+b)∗f(a,b)b*f(a,a+b)=(a+b)*f(a,b)b∗f(a,a+b)=(a+b)∗f(a,b)

mmm次修改数字表格中的一个数,你需要调整其他数字使其满足条件,然后求前kkk行前kkk列的数字和。


解题思路

一道神仙题,首先我们拿出这个不伦不类的式子b∗f(a,a+b)=(a+b)∗f(a,b)b*f(a,a+b)=(a+b)*f(a,b)b∗f(a,a+b)=(a+b)∗f(a,b)化成
f(a,a+b)a(a+b)=f(a,b)ab\frac{f(a,a+b)}{a(a+b)}=\frac{f(a,b)}{ab}a(a+b)f(a,a+b)​=abf(a,b)​
发现这个式子和更相减损法很像,反正最后递归下去可以化成f(a,b)ab=f(gcd(a,b),gcd(a,b))gcd(a,b)2\frac{f(a,b)}{ab}=\frac{f(gcd(a,b),gcd(a,b))}{gcd(a,b)^2}abf(a,b)​=gcd(a,b)2f(gcd(a,b),gcd(a,b))​
定义d=gcd(a,b)d=gcd(a,b)d=gcd(a,b),也就是f(a,b)=f(d,d)abgcd(a,b)2f(a,b)=\frac{f(d,d)ab}{gcd(a,b)^2}f(a,b)=gcd(a,b)2f(d,d)ab​
那么k∗kk*kk∗k的数字和就是∑i=1kfi,i∑x=1k∑y=1kxyi2[gcd(x,y)==i]\sum_{i=1}^kf_{i,i}\sum_{x=1}^k\sum_{y=1}^k\frac{xy}{i^2}[gcd(x,y)==i]i=1∑k​fi,i​x=1∑k​y=1∑k​i2xy​[gcd(x,y)==i]
然后化成∑i=1kfi,i∑x=1⌊ki⌋∑y=1⌊ki⌋xy[gcd(x,y)==1]\sum_{i=1}^kf_{i,i}\sum_{x=1}^{\lfloor\frac{k}{i}\rfloor}\sum_{y=1}^{\lfloor\frac{k}{i}\rfloor}xy[gcd(x,y)==1]i=1∑k​fi,i​x=1∑⌊ik​⌋​y=1∑⌊ik​⌋​xy[gcd(x,y)==1]
之后我们有结论是后面那个东西∑x=1n∑y=1nxy[gcd(x,y)==1]=∑i=1nφ(i)i2\sum_{x=1}^{n}\sum_{y=1}^{n}xy[gcd(x,y)==1]=\sum_{i=1}^n\varphi(i)i^2∑x=1n​∑y=1n​xy[gcd(x,y)==1]=∑i=1n​φ(i)i2
具体证明的话就是

令H(x)=∑x=1n∑y=1nxy[gcd(x,y)==1]H(x)=\sum_{x=1}^{n}\sum_{y=1}^{n}xy[gcd(x,y)==1]H(x)=∑x=1n​∑y=1n​xy[gcd(x,y)==1]
那么H(x)H(x)H(x)比H(x−1)H(x-1)H(x−1)多了一个2x∑y=1n[gcd(x,y)==1]y2x\sum_{y=1}^n[gcd(x,y)==1]y2x∑y=1n​[gcd(x,y)==1]y
也就是多了一个x∗2∗φ(x)x2x*2*\frac{\varphi(x)x}{2}x∗2∗2φ(x)x​

所以可以线性预处理这个东西

我们就可以对后面那个东西做整除分块,我们就需要处理fi,if_{i,i}fi,i​的前缀和

我们一次操作需要进行n\sqrt nn​次询问前缀和,但是修改只需要一次,所以我们可以平衡一下时间。也就是降低询问复杂度提升修改复杂度,用分块存储块中每个位置的块内前缀和和块的前缀和即可。

时间复杂度O(mn)O(m\sqrt n)O(mn​)


codecodecode

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define ll long long
using namespace std;
const ll N=4e6+10,P=1e9+7;
ll n,m,T,w[N],v[N],sum[N],L[N],R[N];
ll cnt,pri[N],phi[N],g[N],pos[N];
ll power(ll x,ll b){ll ans=1;while(b){if(b&1)ans=ans*x%P;x=x*x%P;b>>=1;}return ans;
}
void Prime(){phi[1]=1;for(ll i=2;i<=n;i++){if(!v[i])pri[++cnt]=i,phi[i]=i-1;for(ll j=1;j<=cnt&&i*pri[j]<=n;j++){v[i*pri[j]]=1;if(i%pri[j]==0){phi[i*pri[j]]=phi[i]*pri[j];break;}phi[i*pri[j]]=phi[i]*phi[pri[j]];}}for(ll i=1;i<=n;i++)g[i]=(g[i-1]+phi[i]*i%P*i%P)%P;return;
}
ll GetS(ll x){if(!x)return 0ll;return (sum[pos[x]-1]+w[x])%P;
}
int main()
{scanf("%lld%lld",&m,&n);Prime();T=sqrt(n);for(ll i=1;i<=n;i++)v[i]=i*i%P;for(ll i=1;i<=T;i++)L[i]=R[i-1]+1,R[i]=i*T;if(T*T!=n)T++,L[T]=R[T-1]+1,R[T]=n;for(ll i=1;i<=T;i++){for(ll j=L[i];j<=R[i];j++)pos[j]=i,w[j]=(v[j]+w[j-1]*(j>L[i]))%P;sum[i]=(sum[i-1]+w[R[i]])%P;}while(m--){ll a,b,x,k;scanf("%lld%lld%lld%lld",&a,&b,&x,&k);x%=P;ll d=__gcd(a,b),y=pos[d];v[d]=x*d*d%P*power(a*b%P,P-2)%P;for(ll i=d;i<=R[y];i++)w[i]=((i>L[y])*w[i-1]+v[i])%P;for(ll i=y;i<=T;i++)sum[i]=(sum[i-1]+w[R[i]])%P;ll ans=0;for(ll l=1,r;l<=k;l=r+1){r=k/(k/l);ans=(ans+g[k/l]*(GetS(r)-GetS(l-1)+P)%P)%P;}printf("%lld\n",ans);}return 0;
}

P3700-[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. 小a与黄金街道(欧拉函数)/**模运算规则总结*/

    链接:https://ac.nowcoder.com/acm/contest/317/D 来源:牛客网 题目描述 小a和小b来到了一条布满了黄金的街道上.它们想要带几块黄金回去,然而这里的城管担心他们 ...

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

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

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

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

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

  6. 【CQOI2017】小Q的表格

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

  7. 专题·莫比乌斯函数与欧拉函数【including 整除分块,积性函数,狄利克雷卷积,欧拉函数,莫比乌斯函数,莫比乌斯反演

    初见安~又是好久没写博客了--加上CSP才炸了一波. 目录 一.整除分块 题解 二.积性函数 三.狄利克雷卷积 四.欧拉函数 五.莫比乌斯函数(mu) 六.莫比乌斯反演 一.整除分块 看个例题:洛谷P ...

  8. CCPC-Wannafly Winter Camp Day3 (Div2, onsite) F 小清新数论 欧拉函数的利用 莫比乌斯反演 杜教筛

    F - 小清新数论 做法一:欧拉函数 #include<stdio.h> #include<bits/stdc++.h> using namespace std; #defin ...

  9. 初等数论--同余--欧拉函数、欧拉定理、费马小定理

    初等数论--同余--欧拉函数.欧拉定理.费马小定理 概念 同余类,既约同余类 欧拉函数 完全剩余系,既约剩余系 关于完全剩余系.既约剩余系一些比较简单的定理 欧拉定理.费马小定理 博主是初学初等数论( ...

最新文章

  1. HTTP协议与TCP/IP协议的关系
  2. Linux第二周学习笔记(11)
  3. 露雨资源库(第一个.net2.0软件)二
  4. 自主定义适合自己的Keil主题
  5. sas数据导入终极汇总-之二
  6. java.lang.NoClassDefFoundError:如何解决–第2部分
  7. 四种依恋类型_【工具】成人依恋量类型介绍
  8. virtualenv 的使用 —— PyCharm 与 Jupyter Notebook
  9. 安卓短信功能全解:调用系统短信功能发送短信、彩信,使用SmsManager发送短信,并监听发送短信的投递情况,使用广播接收器监听接收的短信。
  10. 2018年9月28号-10月9号
  11. java oa系统消息推送_第三方系统向泛微OA系统推送消息
  12. spring boot企业合同管理系统毕业设计源码161456
  13. javaIO体系图(2015年9月15日)
  14. SQL 语句,聚沙成塔
  15. 【BZOJ2827】千山鸟飞绝 离散化+splay
  16. 计算机记账的优点,记账凭证的优缺点
  17. win 10 设置透明图表显示为黑色方块问题
  18. 宗地自动编号及属性赋值
  19. 【LeetCode刷题】1619. 删除某些元素后的数组均值
  20. 给Android车载蓝牙音乐添加盘控控制功能

热门文章

  1. qt显示echart_Qt配置,载入html,Echart, 交互
  2. linux默认归档目录,Linux系统管理(第4章:目录和文件管理二)
  3. 四大金刚 数据结构_GIS技术在气象领域应用综述
  4. html assign无效,Object.assign的一些用法
  5. pc模式 华为mate30_华为mate30与电脑连不上怎么回事
  6. c++——reverse()函数的使用
  7. 101. 对称二叉树023(BFS)
  8. react只停留在表层?五大知识点带你梳理进阶知识
  9. C++ class实现链队列(完整代码)
  10. alibaba实习生代码大赛