洛咕 P3700 [CQOI2017]小Q的表格
洛咕 P3700 [CQOI2017]小Q的表格
神仙题orz
首先推一下给的两个式子中的第二个
\(b\cdot F(a,a+b)=(a+b)\cdot F(a,b)\)
先简单的想,\(F(a,a+b)\)和\(F(a,b)\)会相互影响
可以换一种角度想,\(F(a,b-a)\)和\(F(a,b)\)会相互影响\((b>a)\)
那么可以从\(F(x,y)\)一路推下去
\(F(x,y)=F(x,y-x)=F(x,y-2x)=\cdots=F(x,y\mod x)\)
(注意这里的\(\text{mod}\)结果是0的话就没有办法再减了)
这时横坐标比纵坐标大了,利用题目给的式子1,swap横纵坐标
\(F(x,y)=F(x,y\mod x)=F(y\mod x,x)=F(y\mod x,x\mod(y\mod x))=\cdots\)
总结一下,如果继续这样推下去,当横、纵坐标相等时会就不能再减了
刚才是怎么推的呢,就是当x,y不等的时候每次都把x对y取模然后交换x,y
是不是很熟悉,就是求gcd的过程
那么可以推出来,\(\gcd(x,y)\)相等的会相互影响
具体影响多少是显然的,\(F(x,y)=F(\gcd(x,y),\gcd(x,y))\times \frac{xy}{\gcd(x,y)^2}\)
所以只要维护\(F(i,i)\)的值就行了,下面设\(F(i,i)=F(i)\)
现在要算\(\sum_{i=1}^n\sum_{j=1}^nF(i,j)\)
\(ans=\sum_{i=1}^n\sum_{j=1}^nF(\gcd(i,j))\)
考虑枚举\(\gcd(i,j)\),
\(ans=\sum_{k=1}^nF(k)\sum_{i=1}^n\sum_{j=1}^n\frac{ij}{k^2}[\gcd(i,j)=k]\)
\(ans=\sum_{k=1}^nF(k)\sum_{i=1}^{n/k}\sum_{j=1}^{n/k}ij[\gcd(i,j)=1]\)
设\(g(n)=\sum_{i=1}^{n}\sum_{j=1}^{n}ij[\gcd(i,j)=1]\),\(ans=\sum_{k=1}^nF(k)g(n/k)\)
可以只求一半,\(g(n)=2\sum_{i=1}^{n}\sum_{j=1}^{i}ij[\gcd(i,j)=1]-\sum_{i=1}^{n}i^2[\gcd(i,i)=1]\)
右边那一块是显然的
\(g(n)=2\sum_{i=1}^{n}\sum_{j=1}^{i}ij[\gcd(i,j)=1]-1\)
设\(h(n)=\sum_{i=1}^{n}in[gcd(i,n)=1]\),\(g(n)=2\sum_{i=1}^{n}h(i)-1\)
怎么求\(h\)呢,显然可行的\(i\)有\(\varphi(n)\)种,如果\(\gcd(i,n)=1\),那么\(\gcd(n-i,n)=1\)
所以\(i\)和\(n-i\)可以配对,加起来是\(n\),一共\(\varphi(n)/2\)对,\(h(n)=\frac{\varphi(n)\times n^2}{2}\),注意特判\(h(n)=1\),因为不能配对
然后求出了\(h\)就可以求出\(g\),\(F\)每次只会修改一个。要求的\(ans=\sum_{k=1}^nF(k)g(n/k)\)显然\(n/k\)只有根号种取值,数论分块即可,\(F\)树状数组前缀和
#include<bits/stdc++.h>
#define il inline
#define vd void
#define int ll
#define mod 1000000007
typedef long long ll;
il int gi(){
int x=0,f=1;
char ch=getchar();
while(!isdigit(ch)){
if(ch=='-')f=-1;
ch=getchar();
}
while(isdigit(ch))x=x*10+ch-'0',ch=getchar();
return x*f;
}
int g[4000010],h[4000010];
int pri[4000010],pr,phi[4000010];
bool yes[4000010];
int n,m,f[4000010];
il vd update(int x,int p){while(x<=n)f[x]=(f[x]+p)%mod,x+=x&-x;}
il int query(int x){int ret=0;while(x)ret=(ret+f[x])%mod,x-=x&-x;return ret;}
signed main(){
m=gi(),n=gi();
int x,y,k,t,G;
for(int i=1;i<=n;++i)update(i,1ll*i*i%mod);
phi[1]=1;
for(int i=2;i<=n;++i){
if(!yes[i])phi[i]=i-1,pri[++pr]=i;
for(int j=1;j<=pr&&i*pri[j]<=n;++j){
yes[i*pri[j]]=1;
if(i%pri[j]==0){
phi[i*pri[j]]=phi[i]*pri[j];
break;
}
phi[i*pri[j]]=phi[i]*(pri[j]-1);
}
}
for(int i=1;i<=n;++i)h[i]=1ll*phi[i]*i%mod*i%mod;
g[1]=1;
for(int i=2;i<=n;++i)g[i]=(g[i-1]+h[i])%mod;
while(m--){
x=gi(),y=gi();G=std::__gcd(x,y);
t=(gi()/(x/G)/(y/G))%mod;
update(G,(0ll+t-query(G)+query(G-1)+mod)%mod);
k=gi();
int ans=0;
for(int i=1;i<=k;++i){
int j=k/(k/i);
ans=(ans+1ll*(query(j)-query(i-1)+mod)*g[k/i])%mod;
i=j;
}
printf("%lld\n",ans);
}
return 0;
}
洛咕 P3700 [CQOI2017]小Q的表格的更多相关文章
- [bzoj4815] [洛谷P3700] [Cqoi2017] 小Q的表格
Description 小Q是个程序员. 作为一个年轻的程序员,小Q总是被老C欺负,老C经常把一些麻烦的任务交给小Q来处理. 每当小Q不知道如何解决时,就只好向你求助.为了完成任务,小Q需要列一个表格 ...
- 洛谷 P3700 - [CQOI2017]小Q的表格(找性质+数论)
洛谷题面传送门 又是一道需要一些观察的数论 hot tea-- 注意到题目中 \(b·f(a,a+b)=(a+b)·f(a,b)\) 这个柿子长得有点像求解 \(\gcd\) 的辗转相除法,因此考虑从 ...
- 【BZOJ4815】[CQOI2017]小Q的表格(莫比乌斯反演,分块)
[BZOJ4815][CQOI2017]小Q的表格(莫比乌斯反演,分块) 题面 BZOJ 洛谷 题解 神仙题啊. 首先\(f(a,b)=f(b,a)\)告诉我们矩阵只要算一半就好了. 接下来是\(b* ...
- bzoj 4815: [Cqoi2017]小Q的表格 [数论]
4815: [Cqoi2017]小Q的表格 题意: 单点修改,查询前缀正方形和.修改后要求满足条件f(a,b)=f(b,a), b×f(a,a+b)=(a+b)*f(a,b) 一开始sb了认为一次只会 ...
- [BZOJ4815][CQOI2017]小Q的表格(莫比乌斯反演)
4815: [Cqoi2017]小Q的表格 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 832 Solved: 342[Submit][Statu ...
- 洛谷 P3698 [CQOI2017]小Q的棋盘 解题报告
P3698 [CQOI2017]小Q的棋盘 题目描述 小 Q 正在设计一种棋类游戏. 在小 Q 设计的游戏中,棋子可以放在棋盘上的格点中.某些格点之间有连线,棋子只能在有连线的格点之间移动.整个棋盘上 ...
- [bzoj4815]: [Cqoi2017]小Q的表格
来自FallDream的博客,未经允许,请勿转载,谢谢. 小Q是个程序员. 作为一个年轻的程序员,小Q总是被老C欺负,老C经常把一些麻烦的任务交给小Q来处理.每当小Q不知道如何解决时,就只好向你求助. ...
- [CQOI2017]小Q的表格(数论+分块)
题目描述 小Q是个程序员. 作为一个年轻的程序员,小Q总是被老C欺负,老C经常把一些麻烦的任务交给小Q来处理.每当小Q不知道如何解决时,就只好向你求助. 为了完成任务,小Q需要列一个表格,表格有无穷多 ...
- bzoj 4815: [Cqoi2017]小Q的表格【欧拉函数+分块】
参考:http://blog.csdn.net/qq_33229466/article/details/70174227 看这个等式的形式就像高精gcd嘛-所以随便算一下就发现每次修改(a,b)影响到 ...
随机推荐
- LeetCode题解之Binary Number with Alternating Bits
1.题目描述 2.问题分析 将数值转换为二进制,然后将前面的 0 去掉,再遍历一边二进制字符串,对每个字符和其后部的字符进行比较. 3.代码 bool hasAlternatingBits(int n ...
- 一次失败的生产系统中AlwaysOn AG切换经历
14:25分左右,某数据库主副本服务器崩溃报错,在数据库无法接收SQL语句进行调整的情况下重启了主副本服务器. 由于服务器重启时间会比较长,为了保证主副本服务器重启期间数据库能正常进行写入,强制将主库 ...
- 入坑Vue
长期的后端数据开发着实有些枯燥无趣,项目完工,闲暇之际,最近一直在研究前端方面的东西,不得感叹,前端技术发展速度快的让人有些目不暇接,从jQuery开启的插件化时代,几乎许多网站都被jQuery支配, ...
- UIButton vs UIEventListener 事件处理
NGUI的事件 在使用NGUI的事件处理时,发现UIButton和UIEventListener之间的共同点越来越多. 当然处理事件,也有一些其它的函数,比如:UIEventTrigger,Butto ...
- Linux磁盘及分区之wwid和uuid
背景描述,在Linux系统中,如果添加了新的SCSI磁盘或者映射SAN存储LUN操作,重启操作系统之后会出现磁盘标识符(sd*)错乱的情况. 例如之前添加的SAN存储LUN的磁盘标识符为/dev/sd ...
- Redis学习---面试基础知识点总结
[学习参考] https://www.toutiao.com/i6566017785078481422/ https://www.toutiao.com/i6563232898831352323/ 0 ...
- idea 断点上面有x
背景:确定你的java代码没有问题,并且编译通过 问题:debug 启动项目的时候没有问题,idea打断点的时候左边红色断点上面有x 原因:java文件和class文件不一致, 解决方法:ant cl ...
- python中判断实例可迭代地几种方式
1. 利用 __iter__内建属性 if hasattr(obj, '__iter__') : print 'iterable' 这种方法不能检测字符串,如:hasattr('', '__iter_ ...
- Chrome 打印PDF技巧
Chrome 打印PDF技巧 原文地址:https://github.com/zhongxia245/blog/issues/22 欢迎star 本教程,使用Mac电脑进行演示. 常规的Chrome打 ...
- UML学生成绩管理系统需求分析
学生成绩管理系统工作室高校教育工作的一项重要内容.教务管理工作是指学校管理人员按照一定的教育方针,运用先进的管理手段,组织.协调.指挥并指导各用户活动,一边高效率.高质量地完成各项教学任务,完成国家所 ...