题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=4815

题意概述:要认真概述的话这个题就出来了。。。

分析:

  首先分析题目,认真研究一下修改操作,想到一个问题:满足什么样的条件的格子会互相影响?

  看到式子,一想,这正是辗转相除?迅速意识到行列的gcd相同的格子会互相影响。

  然后我们再利用一下系数的关系,把式子变成f(a,a+b)/(a+b)=f(a,b)/b,发现当行相同的时候格子之间的值与所处列数成正比关系,因为题目保证了f(a,b)=f(b,a),同样的性质也会出现在列相同的情况下。对于任意两个互相影响的格子,都可以先变换行坐标再变换列坐标互相到达,于是有:f(a,b)/(a*b)=f(x,y)/(x*y)。

  然后你发现有了这个性质,我们就可以用一维空间来储存所有的格子的值了~

  令gcd(i,j)=g,那么f(i,j)=f(g,g)*(i*j)/(g*g)。我们令f(g)=f(g,g),所有格子(i,j)的值都可以由f(gcd(i,j))得到。

  所以有:

  我们令:,则

  考虑一下s(x)的计算,我们枚举i,然后枚举所有小于i的j,如果i,j互质,我们就统计进入答案,可以看成是统计所有小于i且与i互质的j的和乘以i统计进入答案,根据对称性,另一半方阵是一样的,单独处理对角线上的唯一有贡献的(1,1)即可。

  有一个神奇的公式:小于i且和i互质的正整数的和为phi(i)*i/2(证明:对于一个小于i的x,gcd(i,x)=1,有gcd(i,i-x)=1,也就是说小于i且与i互质的数是成对出现的,并且每一对的和为i,一共有phi(i)/2对)。(对s(x)的计算也可以莫比乌斯反演,借助[gcd(i,j)==1]=[sum{ mu(k) | k|i,k|j,即k|gcd(i,j) }==1],但是我只探索出了70分的世界线......)

  所以:,可以直接预处理出来。

  最后我们只要用一个分块支持O(sqrt(n))修改,O(1)查询,加上用O(sqrt(k))枚举k的约数就可以做到每组询问O(sqrt(n)+sqrt(k))的时间回答了(有的时候分块的O(1)询问是个很棒的东西,弄个树状数组就自寻烦恼了,分块有点小细节,一定要把f(x)的值原原本本地存起来,不能取模)。

  时间复杂度O(M(sqrt(N)+sqrt(K)))。

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<queue>
#include<set>
#include<map>
#include<vector>
#include<cctype>
using namespace std;
const int MAXN=;
const int mo=;
typedef long long LL; int M,N,K;
int pri[MAXN],tot,phi[MAXN],s[MAXN];
bool ntp[MAXN];
struct Block{
static const int maxn=;
static const int size=;
static const int maxm=;
int sum[maxn],flag[maxm],L[maxm],R[maxm],cnt,sz,belong[maxn];
LL f[maxn];
Block(){ sz=; }
void build(int n){
for(sz=;sz+size<n;sz+=size){
cnt++,L[cnt]=sz,R[cnt]=sz+size;
for(int j=L[cnt];j<R[cnt];j++)
f[j]=1ll*j*j,sum[j]=(sum[j-]+f[j]%mo)%mo,belong[j]=cnt;
flag[cnt]=;
}
cnt++,L[cnt]=sz,R[cnt]=n+;
for(int j=L[cnt];j<R[cnt];j++)
f[j]=1ll*j*j,sum[j]=(sum[j-]+f[j]%mo)%mo,belong[j]=cnt;
flag[cnt]=;
sz=n;
}
void update(int p,LL v){
int delt=((v-f[p])%mo+mo)%mo;
f[p]=v;
for(int i=p;i<R[belong[p]];i++)
sum[i]=(sum[i]+delt)%mo;
for(int i=belong[p]+;i<=cnt;i++)
flag[i]=(flag[i]+delt)%mo;
}
int query(int p){
return (sum[p]+flag[belong[p]])%mo;
}
}block; void ready()
{
ntp[]=ntp[]=,phi[]=;
for(int i=;i<=N;i++){
if(!ntp[i]) pri[++tot]=i,phi[i]=i-;
for(int j=;j<=tot&&1ll*pri[j]*i<=N;j++){
ntp[pri[j]*i]=;
if(i%pri[j]==){
phi[i*pri[j]]=phi[i]*pri[j];
break;
}
phi[i*pri[j]]=phi[i]*(pri[j]-);
}
}
block.build(N);
for(int i=;i<=N;i++)
s[i]=(s[i-]+1ll*i*i%mo*phi[i]%mo)%mo;
}
int gcd(int x,int y){ return !y?x:gcd(y,x%y); }
void work()
{
scanf("%d%d",&M,&N);
ready();
int a,b,k,p,ans,d; LL x;
for(int i=;i<=M;i++){
scanf("%d%d%lld%d",&a,&b,&x,&k);
p=gcd(a,b);
block.update(p,x/(a/p)/(b/p));
ans=;
for(int g=,last;g<=k;g=last+){
last=k/(k/g);
d=((block.query(last)-block.query(g-))%mo+mo)%mo;
ans=(ans+1ll*s[k/g]*d%mo)%mo;
}
printf("%d\n",ans);
}
}
int main()
{
work();
return ;
}

BZOJ 4815 CQOI2017 小Q的表格 欧拉函数+分块的更多相关文章

  1. BZOJ 4815 [Cqoi2017]小Q的表格 ——欧拉函数

    把式子化简一波. 发现一个比较厉害的性质:每个点只能影响到行列下标$gcd$与它相同的点. 然后就可以计算$\sum_{g<=k}f(g,g)*\sum_{i<=k}\sum_{j< ...

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

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

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

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

  4. bzoj 4815 [Cqoi2017]小Q的表格——反演+分块

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4815 大概就是推式子的时候注意有两个边界都是 n ,考虑变成 2*... 之类的. 分块维护 ...

  5. 【BZOJ】2005: [Noi2010]能量采集(欧拉函数+分块)

    http://www.lydsy.com/JudgeOnline/problem.php?id=2005 首先和某题一样应该一样可以看出每个点所在的线上有gcd(x,y)-1个点挡着了自己... 那么 ...

  6. 4815: [Cqoi2017]小Q的表格 莫比乌斯反演 分块

    (Updated 2018.04.28 : 发现公式效果不好,重新处理图片)国际惯例的题面:看到这两个公式,很多人都会想到与gcd有关.没错,最终的结论就是f(a,b)=f(gcd(a,b))*(a/ ...

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

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

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

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

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

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

随机推荐

  1. Java设计模式六大原则-1

    Java设计模式六大原则-1 做Java程序开发的每天都在使用JDK,Spring,SpringMvc,Mybatis,Netty,MINA等框架,但很少有人懂得背后的原理.即使打开跟下原码也是一头雾 ...

  2. mysql启动错误处理

    1.当启动MySQL时,报如下错误 [ERROR] Plugin 'InnoDB' init function returned error.[ERROR] Plugin 'InnoDB' regis ...

  3. SQL注入的浅尝辄止

    简单的说,SQL注入就是通过在前端页面输入SQL语句,导致系统暴露异常信息在前端页面显示,非法者通过这些异常信息获取数据库的相干信息,为攻击系统做准备.

  4. 前端jQuery实现瀑布流

    瀑布流是我们经常会见到的东西,一直刷新一直有,其实它实现起来是很简单的.具体代码如下 1.css代码 <style> *{ margin:; padding:; } .container{ ...

  5. Redis学习笔记(一)

    定义 Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库. 从该定义中抽出几个关键信息,以表示Redis的特性: 存储结构:key-val ...

  6. thinkphp5 toArray()报错

    //DB操作返回是数组.模型直接操作返回是对象 //对象类型转换数组 //打开 database.php 增加或修改参数 'resultset_type' => '\think\Collecti ...

  7. 【Hive三】Hive理论

    1. Hive基础 1. Hive基础 Hive基本概念 引入原因: Hive是什么 Hive数据管理 四种数据模型 Hive内部表和外部表 Hive数据类型 Hive的优化 Map的优化: Redu ...

  8. spark sql cache时发现的空字符串问题

    博客园首发,转帖请注明地址:https://www.cnblogs.com/tzxxh/p/10267202.html 图一 图1未做cache,直接过滤expression列的 null 和空字符串 ...

  9. kubernetes理论基础#开始入坑啊!

    什么是kubernetes 首先,他是一个全新的基于容器技术的分布式架构领先方案.Kubernetes(k8s)是Google开源的容器集群管理系统(谷歌内部:Borg).在Docker技术的基础上, ...

  10. DNS服务器的简介——2

    生成HTTP报文后,因为我们输入的是服务器的域名,但在包体的发送中需要的是服务器的IP地址,所以接下来的工作就是查找服务器的IP地址,而查询IP地址,就需要DNS服务器来帮忙了. IP地址简介: IP ...