[CQOI2017]小Q的表格——反演好题
难得一见的新颖反演题。
一眼看可能不是反演题。
修改影响别的,很恶心。
所以考虑化简f的联系式,发现和gcd有关
于是考虑用gcd来表示所有的gcd(a,b)=g的所有f(a,b)
于是二维利用结合律变成了一维的问题。
修改(a,b)本质上是修改f(g,g),因为其他的数用f(g,g)表示,都在式子里。
支持单点修改,带入k询问这个函数的值。
已经可以O(根号)查一次。
对于式子反演,
单点修改,要支持区间和(前缀和)维护。
树状数组轻而易举,但是查询有logn
然后m1e4,n4e6的数据很有意思。修改复杂度可以高一些,希望吧查询降到O(1)
考虑O(根号)修改O(1)前缀和查询。分块即可。
// luogu-judger-enable-o2
#include<bits/stdc++.h>
#define reg register int
#define il inline
#define numb (ch^'0')
using namespace std;
typedef long long ll;
il void rd(ll &x){
char ch;x=;bool fl=false;
while(!isdigit(ch=getchar()))(ch=='-')&&(fl=true);
for(x=numb;isdigit(ch=getchar());x=x*+numb);
(fl==true)&&(x=-x);
}
namespace Miracle{
const int N=4e6+;
const int mod=1e9+;
const int blo=2e3;
bool vis[N];
ll n,m;
int pri[N],tot;
int phi[N];
int g[N];
int be[N];
int le[N],ri[N],cnt;//information of blo
int sum[N],pre[N];
int v[N];
int add(int x,int y){
return (y>=)?(x+y>=mod?x+y-mod:x+y):(x+y<?x+y+mod:x+y);
}
int gcd(int a,int b){
return b?gcd(b,a%b):a;
}
void sieve(){
phi[]=;
for(reg i=;i<=n;++i){
//if(i>3903333)cout<<" i "<<i<<endl;
if(!vis[i]){
pri[++tot]=i;
phi[i]=i-;
}
for(reg j=;j<=tot;++j){
if((ll)pri[j]*i>n) break;
vis[pri[j]*i]=;
if(i%pri[j]==){
phi[i*pri[j]]=phi[i]*pri[j];
break;
}
phi[i*pri[j]]=phi[i]*(pri[j]-);
}
}
for(reg i=;i<=n;++i) g[i]=(ll)i*i%mod*phi[i]%mod;
for(reg i=;i<=n;++i) g[i]=add(g[i],g[i-]);
}
int query(int l,int r){
if(l!=le[be[l]]) return add(add(add(sum[be[r]-],-sum[be[l]-]),pre[r]),-pre[l-]);
else return add(add(sum[be[r]-],-sum[be[l]-]),pre[r]);
}
int qm(int x,int y){
int ret=;
while(y){
if(y&) ret=(ll)ret*x%mod;
x=(ll)x*x%mod;
y>>=;
}
return ret;
}
int main(){
rd(m);rd(n);
sieve();
//cout<<" after sieve "<<endl;
for(reg i=;i<=n;++i){
be[i]=(i-)/blo+;
v[i]=(ll)i*i%mod;
if(be[i]!=be[i-])le[be[i]]=i;
ri[be[i]]=max(ri[be[i]],i);
} cnt=be[n];
for(reg i=;i<=cnt;++i){
//cout<<i<<" "<<le[i]<<" "<<ri[i]<<endl;
pre[le[i]]=(ll)le[i]*le[i]%mod;
for(reg j=le[i]+;j<=ri[i];++j){
pre[j]=add(pre[j-],(ll)j*j%mod);
}
sum[i]=add(sum[i-],pre[ri[i]]);
}
//cout<<" after blo "<<endl;
ll a,b,x,k;
while(m--){
rd(a);rd(b);rd(x);rd(k);
int gc=gcd(a,b);
x%=mod;
x=(ll)gc*gc%mod*x%mod*qm((ll)a*b%mod,mod-)%mod;
v[gc]=x;
if(gc==le[be[gc]]) pre[gc]=x;
else pre[gc]=add(pre[gc-],x);
for(reg i=gc+;i<=ri[be[gc]];++i){
pre[i]=add(pre[i-],v[i]);
}
for(reg i=be[gc];i<=cnt;++i){
sum[i]=add(sum[i-],pre[ri[i]]);
} ll ans=;
for(reg i=,x=;i<=k;i=x+){
x=k/(k/i);
ans=add(ans,(ll)query(i,x)*g[(k/i)]%mod);
}
printf("%lld\n",ans);
}
return ;
} }
signed main(){
Miracle::main();
return ;
} /*
Author: *Miracle*
Date: 2018/12/26 20:57:31
*/
思路:
1.看修改鬼畜,f关系鬼畜,影响范围估计有规律。考虑手玩或者推式子。
2.发现和gcd有关,考虑用gcd表示,上反演
3.反演之后,要动态维护前缀和,分块。
转化还是很巧妙的2333~
[CQOI2017]小Q的表格——反演好题的更多相关文章
- 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* ...
- [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了认为一次只会 ...
- 洛咕 P3700 [CQOI2017]小Q的表格
洛咕 P3700 [CQOI2017]小Q的表格 神仙题orz 首先推一下给的两个式子中的第二个 \(b\cdot F(a,a+b)=(a+b)\cdot F(a,b)\) 先简单的想,\(F(a,a ...
- [CQOI2017]小Q的表格(数论+分块)
题目描述 小Q是个程序员. 作为一个年轻的程序员,小Q总是被老C欺负,老C经常把一些麻烦的任务交给小Q来处理.每当小Q不知道如何解决时,就只好向你求助. 为了完成任务,小Q需要列一个表格,表格有无穷多 ...
- [bzoj4815] [洛谷P3700] [Cqoi2017] 小Q的表格
Description 小Q是个程序员. 作为一个年轻的程序员,小Q总是被老C欺负,老C经常把一些麻烦的任务交给小Q来处理. 每当小Q不知道如何解决时,就只好向你求助.为了完成任务,小Q需要列一个表格 ...
- [bzoj4815]: [Cqoi2017]小Q的表格
来自FallDream的博客,未经允许,请勿转载,谢谢. 小Q是个程序员. 作为一个年轻的程序员,小Q总是被老C欺负,老C经常把一些麻烦的任务交给小Q来处理.每当小Q不知道如何解决时,就只好向你求助. ...
- 4815: [Cqoi2017]小Q的表格 莫比乌斯反演 分块
(Updated 2018.04.28 : 发现公式效果不好,重新处理图片)国际惯例的题面:看到这两个公式,很多人都会想到与gcd有关.没错,最终的结论就是f(a,b)=f(gcd(a,b))*(a/ ...
随机推荐
- Python 多线程、进程、协程上手体验
浅谈 Python 多线程.进程.协程上手体验 前言:浅谈 Python 很多人都认为 Python 的多线程是垃圾(GIL 说这锅甩不掉啊~):本章节主要给你体验下 Python 的两个库 Thre ...
- Struts2(九.初始化用户列表时显示用户照片数目)
1.userlist.jsp //显示每个用户照片的数目(遍历每个用户) $(".picture").each(function(i,e){ $.post("${page ...
- Java学习笔记-13.创建窗口和程序片
1.init()方法:程序片第一次被创建,初次运行初始化程序片时调用. start()方法:每当程序片进入web浏览器中,并且允许程序片启动他的常规操作时调用(特殊的程序片被stop()关闭):同样在 ...
- Python3 数据类型-字符串
字符串是 Python 中最常用的数据类型,是一个个字符组成的有序的序列,是字符的集合. 一 字符串定义 创建字符串很简单,可以使用引号('或"或""")来创建 ...
- Python3 数据类型-列表
序列是Python中最基本的数据结构.序列中的每个元素都分配一个数字 - 它的位置,或索引,第一个索引是0,第二个索引是1,依此类推. 索引如下图: 列表命名(list): 组成:使用[]括起来,并且 ...
- mysql 只返回一条数据
问题描述: 需要得到时间最近的一条记录,但是按照时间字段排完序之后,得到的是全部. 解决办法: order by createtime desc //降序:asc:升序 LIMIT 1
- Android - 按钮组件详解
总结了Android中常用的按钮用法 示例源码下载地址 : -- CSDN : http://download.csdn.net/detail/han1202012/6852091 -- GitHu ...
- 【IdentityServer4文档】- 支持和咨询选项
支持和咨询选项 我们为 IdentityServer 提供多个免费和商业支持及咨询选项. 免费支持 免费支持是基于社区的,而且使用的是公共论坛 StackOverflow 有越来越多的使用 Ident ...
- jquery delayLoading.js插件的延迟加载效果和图片延迟加载
1.首页给大家介绍一下这款插件的主要用途 主要应用于图片的延迟加载,而且可以变换不同的延迟加载效果,适合相册图片.有做相册的可以考虑应用. 2.兼容IE7以上都兼容,其他的浏览器也兼容.所以说兼容性还 ...
- mini2440 Nor Flash工作原理分析
我的mini2440上是只接了一块Nor Flash,型号是S29AL016M90TAI02,这是一块2M Byte,16位宽度的Nor Flash,用于引导扇区的闪存.原理图里面关键的引脚是: 地址 ...