【CQOI2017】小Q的表格

稍加推导就会发现\(f(a,b)=a\cdot b\cdot h(gcd(a,b))\)。

初始时\(h(n)=1\)。

询问前\(k\)行\(k\)列时我们就反演:

\[\begin{align}
\displaystyle
ans&=\sum_{g=1}h(g)\cdot g^2\sum_{a=1}^{\lfloor\frac{k}{g}\rfloor} \sum_{b=1}^{\lfloor\frac{k}{g}\rfloor}a\cdot b\sum_{d|a,d|b}\mu(d)\\
&=\sum_{g=1}h(g)\cdot g^2\sum_{d=1}^{\lfloor\frac{k}{g}\rfloor}d^2\cdot \mu(d)\cdot sum^2(\lfloor\frac{k}{gd}\rfloor)
\end{align}
\]

其中\(\displaystyle sum(n)=\sum_{i=1}^ni\)。

我们设

\[\displaystyle
q(n)=\sum_{d=1}^n d^2\cdot \mu(d)\cdot sum^2(\lfloor\frac{n}{d}\rfloor)
\]

我们可以在\(O(NlogN)\)的时间内求出所有的\(q(i)\)。

考虑\(q(n)\)与\(q(n-1)\)的区别:只有在\(d|n\)的时候才会产生。

所以:

\[\displaystyle
q(n)=q(n-1)+\sum_{d|n}d^2\mu(d)(sum^2(\frac{n}{d})-sum^2(\frac{n}{d}-1))
\]

于是我们就可以数论分块处理询问。

但是如果我们用树状数组处理修改,那么我们的复杂度就多了一个\(log\),无法接受。所以我们牺牲修改时间来平衡询问时间。

使用分块来维护\(h(g)\cdot g^2\)的前缀和。

代码:

#include<bits/stdc++.h>
#define ll long long
#define N 4000005 using namespace std;
inline ll Get() {ll x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9') {if(ch=='-') f=-1;ch=getchar();}while('0'<=ch&&ch<='9') {x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}return x*f;} int n,m;
ll a,b;
ll x,k;
const ll mod=1e9+7;
int gcd(int a,int b) {return !b?a:gcd(b,a%b);}
bool vis[N];
int p[N],u[N];
ll g[N],f[N],sum[N];
ll inv[N],bel[N];
const int blk=2e3+7;
int add[blk]; void pre(int n) {
g[1]=u[1]=1;
for(int i=2;i<=n;i++) {
if(!vis[i]) {
g[i]=mod+1-inv[i];
p[++p[0]]=i;
}
for(int j=1;j<=p[0]&&1ll*i*p[j]<=n;j++) {
vis[i*p[j]]=1;
if(i%p[j]==0) {
g[i*p[j]]=g[i];
break;
}
g[i*p[j]]=1ll*(mod+1-inv[p[j]])*g[i]%mod;
}
}
for(int i=1;i<=n;i++) {
g[i]=(1ll*g[i]*i%mod*i%mod*i%mod+g[i-1])%mod;
}
} void Add(int v,int x) {
int b=bel[v];
for(int i=(b-1)*blk+1;bel[i]==b;i++) (f[i]+=add[b])%=mod;
add[b]=0;
for(int i=v;bel[i]==b;i++) (f[i]+=x)%=mod;
for(int i=b+1;i<=bel[n];i++) (add[i]+=x)%=mod;
} ll query(int v) {return (f[v]+add[bel[v]])%mod;} int solve(int n) {
ll ans=0,last=0;
for(int i=1;i<=n;i=last+1) {
last=n/(n/i);
(ans+=1ll*(query(last)-query(i-1)+mod)*g[n/i])%=mod;
}
return ans;
} int main() {
m=Get(),n=Get();
inv[1]=inv[0]=1;
for(int i=2;i<=n;i++) inv[i]=1ll*(mod-mod/i)*inv[mod%i]%mod;
pre(n);
for(int i=1;i<=n;i++) bel[i]=(i-1)/blk+1;
for(int i=1;i<=n;i++) f[i]=1ll*i*i%mod;
for(int i=1;i<=n;i++) f[i]=(f[i]+f[i-1])%mod;
while(m--) {
a=Get(),b=Get(),x=Get(),k=Get();
int g=gcd(a,b);
ll now=x%mod*inv[a]%mod*inv[b]%mod*g%mod*g%mod;
now=(now-(query(g)-query(g-1))+mod)%mod;
Add(g,now);
int ans=0;
cout<<solve(k)<<"\n";
}
return 0;
}

【CQOI2017】小Q的表格的更多相关文章

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

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

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

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

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

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

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

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

  5. [bzoj4815]: [Cqoi2017]小Q的表格

    来自FallDream的博客,未经允许,请勿转载,谢谢. 小Q是个程序员. 作为一个年轻的程序员,小Q总是被老C欺负,老C经常把一些麻烦的任务交给小Q来处理.每当小Q不知道如何解决时,就只好向你求助. ...

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

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

  7. [bzoj4815] [洛谷P3700] [Cqoi2017] 小Q的表格

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

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

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

  9. BZOJ 4815 CQOI2017 小Q的表格 欧拉函数+分块

    题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=4815 题意概述:要认真概述的话这个题就出来了... 分析: 首先分析题目,认真研究一下修 ...

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

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

随机推荐

  1. 操作失败: 无法更改关系,因为一个或多个外键属性不可以为 null

    报错:操作失败: 无法更改关系,因为一个或多个外键属性不可以为 null  . 同时修改主表和从表的数据,想用EF主表T_ReviewPlan中某个对象item删除item对应的从表T_ReviewS ...

  2. 【开源程序(C++)】获取bing图片并自动设置为电脑桌面背景

    众所周知,bing搜索网站首页每日会更新一张图片,张张漂亮(额,也有一些不合我口味的),特别适合用来做电脑壁纸. 我们想要将bing网站背景图片设置为电脑桌面背景的通常做法是: 上网,搜索bing 找 ...

  3. nginx配置虚拟机

    在/usr/local/nginx/conf目录下nginx.conf文件是nginx的配置文件. 一.通过端口号区分虚拟机 在nginx.conf文件中添加一个Service节点,修改端口号: se ...

  4. SpringBoot简介

    Spring Boot,简单讲就是牺牲项目的自由度来减少配置的复杂度(“契约式编程”思想,SpringBoot自动配置方案的指导思想).约定一套规则,把这些框架都自动配置集成好,从而达到“开箱即用”. ...

  5. mediainfo使用

    1.linux安装mediainfo     yum  install  mediainfo(epel源安装) 2.输出文件信息到xml文件 mediainfo --OUTPUT=XML -f ftp ...

  6. nginx比apache处理静态文件速度快,但是nginx处理大量并发的php请求时,容易出现502错误,频率大概是多少

    首先要明确一点的是502是怎么出现的,为什么会出现502呢? 一般而言,出现502的错误是因为php-cgi连接数不够导致的.举个例子:php-cgi开10个进程,前端发20个请求,每个请求的脚本都s ...

  7. 使用JavaScript获取URL中的参数(两种方法)

    本文给大家分享两种方法使用js获取url中的参数,其中方法二是使用的正则表达式方法,大家可以根据需要选择比较好的方法,废话不多说了,直接看详细介绍吧. 方法一: //取url参数 var type = ...

  8. JavaScript易错知识点整理[转]

    前言 本文是我学习JavaScript过程中收集与整理的一些易错知识点,将分别从变量作用域,类型比较,this指向,函数参数,闭包问题及对象拷贝与赋值这6个方面进行由浅入深的介绍和讲解,其中也涉及了一 ...

  9. iphone怎么投屏到电脑屏幕上

    随着苹果手机的更显换代,苹果手机的功能越来越强大,其中iphone手机更新了airplay镜像功能,所以想要手机投屏电脑的小伙伴就更加方便了,但是iphone怎么投屏到电脑呢?大家不用着急,下面即将为 ...

  10. Ne10编译安装

    介绍 NEON,即"ARM Advanced SIMD",是ARM从ARMv7开始提供的高级单指令多数据(SIMD)扩展.它是一种64/128位混合SIMD体系结构.NEON在网上 ...