[BZOJ4815][CQOI2017]小Q的表格 数论+分块
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=4815
题目中所给条件中的$(a,a+b)$和$(a,b)$的关系很瞩目。
然后大家都知道$(a,b)=(a,a-b)=(a,a+b)$,于是观察(猜)一下这个表格与gcd的关系。
可以发现每次修改$(a,b)$会影响到所有$(i,j)=(a,b)$的点,并且关系为$$f(i,j)=\frac{i}{a}*\frac{j}{b}*f(a,b)$$
所以只需要知道$f(d,d)$的值记为$f(d)$,就能推出其他的值。
然后慢慢推推推大概可以推到这一步$$ans=\sum_{d=1}^nf(d)\sum_{i=1}^{\frac{n}{d}}\sum_{j=1}^{\frac{n}{d}}(i,j)[(i,j)==1]$$
可以发现这个式子中$i$和$j$是对称的$$S(\frac{n}{d})=\sum_{i=1}^{\frac{n}{d}}\sum_{j=1}^{\frac{n}{d}}(i,j)[(i,j)==1]$$
不妨先设$i>j$,于是我们有$$S′(n)=\sum_{i=1}^n\frac{φ(i)*i^{2}}{2}$$
由于$i$与$j$对称,所以有$$S(n)=2*S′(n)=\sum_{i=1}^nφ(i)*i^{2}$$
所以最终的答案就变成了$$ans=\sum_{d=1}^nf(d)S(\frac{n}{d})$$
我们记录$f$的前缀和,并且分块维护这个数列,而$S$很明显是可以预处理出来的。
询问了$m$次,于是总体复杂度应该是$O(m\sqrt{n})$
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long ll;
const int mod=1e9+;
int inline readint(){
int Num;char ch;
while((ch=getchar())<''||ch>'');Num=ch-'';
while((ch=getchar())>=''&&ch<='') Num=Num*+ch-'';
return Num;
}
ll inline readll(){
ll Num;char ch;
while((ch=getchar())<''||ch>'');Num=ch-'';
while((ch=getchar())>=''&&ch<='') Num=Num*+ch-'';
return Num;
}
void outint(int x){
if(x>=) outint(x/);
putchar(x%+'');
}
int inline gcd(int x,int y){
return !y?x:gcd(y,x%y);
}
int n,m;
int phi[],p[],cnt=;
int la,blk,add[];
int f[];
bool vis[];
void sieve(int n){
for(int i=;i<=n;i++){
if(!vis[i]){
p[++cnt]=i;
phi[i]=i-;
}
for(int j=;p[j]*i<=n;j++){
vis[p[j]*i]=true;
if(i%p[j]==){
phi[p[j]*i]=phi[i]*p[j];
break;
}
phi[p[j]*i]=phi[i]*(p[j]-);
}
phi[i]=(1LL*i*i%mod*phi[i]+phi[i-])%mod;
f[i]=(1LL*i*i+f[i-])%mod;
}
}
void modify(int x,int ad){
int l=(x-)/blk+,
r=min(n,l*blk);
for(int i=l+;i<=la;i++) add[i]=(add[i]+ad)%mod;
for(int i=x;i<=r;i++) f[i]=(f[i]+ad)%mod;
}
int inline qry(int x){
return x?(f[x]+add[(x-)/blk+])%mod:;
}
int main(){
m=readint();
n=readint();
f[]=phi[]=;
blk=(int)sqrt(n);
la=(n-)/blk+;
sieve(n);
for(int i=;i<=m;i++){
int a=readint(),
b=readint(),
g=gcd(a,b),
ans=;
ll x=readll();
int k=readint();
x=x/(1LL*(a/g)*(b/g))%mod;
modify(g,((x-qry(g)+qry(g-))%mod+mod)%mod);
for(int j=,now;j<=k;j=now+){
now=k/(k/j);
ans=(ans+1LL*(qry(now)-qry(j-)+mod)%mod*phi[k/j])%mod;
}
outint(ans);
putchar('\n');
}
return ;
}
[BZOJ4815][CQOI2017]小Q的表格 数论+分块的更多相关文章
- [CQOI2017]小Q的表格(数论+分块)
题目描述 小Q是个程序员. 作为一个年轻的程序员,小Q总是被老C欺负,老C经常把一些麻烦的任务交给小Q来处理.每当小Q不知道如何解决时,就只好向你求助. 为了完成任务,小Q需要列一个表格,表格有无穷多 ...
- [BZOJ4815][CQOI2017]小Q的表格(莫比乌斯反演)
4815: [Cqoi2017]小Q的表格 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 832 Solved: 342[Submit][Statu ...
- 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的表格
来自FallDream的博客,未经允许,请勿转载,谢谢. 小Q是个程序员. 作为一个年轻的程序员,小Q总是被老C欺负,老C经常把一些麻烦的任务交给小Q来处理.每当小Q不知道如何解决时,就只好向你求助. ...
- BZOJ4815 [CQOI2017]小Q的表格 【数论 + 分块】
题目链接 BZOJ4815 题解 根据题中的式子,手玩一下发现和\(gcd\)很像 化一下式子: \[ \begin{aligned} bf(a,a + b) &= (a + b)f(a,b) ...
- bzoj 4815 [Cqoi2017]小Q的表格——反演+分块
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4815 大概就是推式子的时候注意有两个边界都是 n ,考虑变成 2*... 之类的. 分块维护 ...
- 【BZOJ4815】[CQOI2017]小Q的表格(莫比乌斯反演,分块)
[BZOJ4815][CQOI2017]小Q的表格(莫比乌斯反演,分块) 题面 BZOJ 洛谷 题解 神仙题啊. 首先\(f(a,b)=f(b,a)\)告诉我们矩阵只要算一半就好了. 接下来是\(b* ...
- 洛咕 P3700 [CQOI2017]小Q的表格
洛咕 P3700 [CQOI2017]小Q的表格 神仙题orz 首先推一下给的两个式子中的第二个 \(b\cdot F(a,a+b)=(a+b)\cdot F(a,b)\) 先简单的想,\(F(a,a ...
- [bzoj4815] [洛谷P3700] [Cqoi2017] 小Q的表格
Description 小Q是个程序员. 作为一个年轻的程序员,小Q总是被老C欺负,老C经常把一些麻烦的任务交给小Q来处理. 每当小Q不知道如何解决时,就只好向你求助.为了完成任务,小Q需要列一个表格 ...
随机推荐
- SQLServer删除数据库
删除时提示: 网上找了一段: USE MASTER GO DECLARE @dbname SYSNAME SET @dbname = 'shujk' --这个是要删除的数据库库名 ) DECLARE ...
- spring boot实现文件上传下载
spring boot 引入”约定大于配置“的概念,实现自动配置,节约了开发人员的开发成本,并且凭借其微服务架构的方式和较少的配置,一出来就占据大片开发人员的芳心.大部分的配置从开发人员可见变成了相对 ...
- SRM691 Sunnygraphs2
Problem Statement Hero has just constructed a very specific graph. He started with n isolated vertic ...
- 如何编写linux下nand flash驱动-3
[读(read)操作过程详解] 以最简单的read操作为例,解释如何理解时序图,以及将时序图 中的要求,转化为代码. 解释时序图之前,让我们先要搞清楚,我们要做的事情:那就是,要从nand flash ...
- bzoj4276
线段树优化建图+费用流 朴素的做法是每个强盗直接对每个区间的每个点连边,然后跑最大权匹配,这样有5000*5000条边,肯定过不去,那么我们用线段树优化一下,因为线段树能把一个O(n)的区间划分为O( ...
- mysql 数据库的名称不能以数字开头
mysql 数据库的名称不能以数字开头
- java笔记之线程简述1
1:线程是依赖于进程而存在. 2:什么是进程? 通过任务管理器我们就看到了进程的存在. 而通过观察,我们发现只有运行的程序才会出现进程. 进程:就是正在运行的程序. 进程是系统进行资源分配和调 ...
- MVC接受JSON的一些注意事项
1.MVC接受前端传的JSON数据,相应的接受参数的位置使用@RequestBody注解进行标注 2.JSON传空字符串时,后台使用Integer进行接受时,会报for String ''一堆乱七八糟 ...
- P4170 [CQOI2007]涂色
传送门 区间dp,设\(f[l][r]\)表示区间\((l,r)\)的最小次数,当\(l==r\)时为\(1\),当\(s[l]==s[r]\)时为\(min(f[l][r-1],f[l+1][r]) ...
- 洛谷P2082 区间覆盖(加强版)(珂朵莉树)
传送门 虽然是黄题而且还是一波离散就能解决的东西 然而珂朵莉树还是很好用 相当于一开始区间全为0,然后每一次区间赋值,问最后总权值 珂朵莉树搞一搞就好了 //minamoto #include< ...