洛咕 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)影响到 ...
随机推荐
- 在Docker Swarm上部署Apache Storm:第2部分
[编者按]本文来自 Baqend Tech Blog,描述了如何在 Docker Swarm,而不是在虚拟机上部署和调配Apache Storm集群.文章系国内 ITOM 管理平台 OneAPM 编译 ...
- python-docx 使用教程
快速入门 入门python-docx很容易.让我们来看一下基础知识. 官方文档地址请点击 打开文档 你需要的第一件事是工作的文档.最简单的方法是: from docx import Document ...
- PHP正则自动验证传入数据
本文出至:新太潮流网络博客 /** * [is_string_regular_type 正则自动验证传入数据] * @E-mial wuliqiang_aa@163.com * @TIME 2017- ...
- SELECT查询结果集INSERT到数据表
简介 将查询语句查询的结果集作为数据插入到数据表中. 一.通过INSERT SELECT语句形式向表中添加数据 例如,创建一张新表AddressList来存储班级学生的通讯录信息,然后这些信息恰好存在 ...
- 索引,B+ tree,动态hash表
数据库课索引部分的学习笔记. 教材: Database System: The Complete Book, Chapter 15 Database System Implementation, Ch ...
- python 多进程 Event的使用
Event事件 多进程的使用 通俗点儿讲 就是 1. Event().wait() 插入在进程中插入一个标记(flag) 默认为 false 然后flag为false时 程序会停止运 ...
- fatal: cannot create directoryxxxx': Invalid argument
问题:fatal: cannot create directoryxxxx': Invalid argument 环境:git 拉取远程仓库的代码后 原因:同事是mac,这个文件夹命名规则在苹果上没有 ...
- js fetch处理异步请求
以往一直认为异步请求只能使用原生js的XMLHttpRequest或jQuery的$.ajax().$.post()等框架封装的异步请求方法 原来js还提供fetch来替代XMLHttpRequest ...
- MySQL报错:error1130
ERROR (HY000): Host 'ip-172-31-x-x.ec2.internal' is not allowed to connect to this MySQL server 分析,从 ...
- django模板系统(下)
主要内容:母版,继承母版,块,组件,静态文件 母版 <!DOCTYPE html> <html lang="en"> <head> <me ...