【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. MyISAM和InnoDB区别详解

    MyISAM是MySQL的默认数据库引擎(5.5版之前),由早期的ISAM(Indexed Sequential Access Method:有索引的顺序访问方法)所改良.虽然性能极佳,但却有一个缺点 ...

  2. mybatis整合springboot 以及需要注意的细节

    具体怎么整合的网上有很多优秀的博客介绍,这里就直接引用一篇个人觉得非常详细的教程: https://blog.csdn.net/winter_chen001/article/details/77249 ...

  3. 【Java每日一题】20170213

    20170210问题解析请点击今日问题下方的“[Java每日一题]20170213”查看(问题解析在公众号首发,公众号ID:weknow619) package Feb2017; public cla ...

  4. python基础学习(十)字符串

    字符串的定义 字符串 就是 一串字符,是编程语言中表示文本的数据类型 在 Python 中可以使用 一对双引号 " 或者 一对单引号 ' 定义一个字符串 虽然可以使用 \" 或者 ...

  5. Javascript动态引用CSS文件的2种方法介绍

    最近做一个项目,需要javascript动态插入样式,结果以前的方法失效了!查了2个小时的原因竟然是自己手贱,这个最后再说! javascript插入样式在前端开发中应用比较广泛,特别是在修改前端表现 ...

  6. ES6中字符串扩展

    ES6中字符串扩展 ① for...of 遍历字符串: 例如: for(let codePoint of 'string'){ console.log(codePoint) } 运行结果: ②  in ...

  7. angular select2 ng-model 取值 ng-change调用方法

    页面: 引入文件 '/select2.css', '/select2-bootstrap.css', '/select2.min.js', '/ui-select2.js' html: <div ...

  8. 【20190130】CSS-文字排版

    字间距:letter-space:**px: 禁止中文词内换行:给每个单词设置 white-space: nowrap;

  9. Tars 服务调服务

    1,创建一个 tars 服务工程 2,把需要调用的服务的 客户端接口文件 拷贝到当前服务 3,构建通信器 CommunicatorConfig 调用,如果是 springboot 开发客户端可以使用注 ...

  10. Android 实现锚点定位

    相信做前端的都做过页面锚点定位的功能,通过<a href="#head"> 去设置页面内锚点定位跳转. 本篇文章就使用tablayout.scrollview来实现an ...