[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/ ...
随机推荐
- Spring Boot 示例项目
Spring Boot 基于注解式开发 maven REST 示例项目 项目地址:https://github.com/windwant/spring-boot-service 项目地址: ...
- def语句和参数
如果调用print()或len()函数,你会传入一些值,放在括号内,在这里成为“参数”.也可以自己定义接受参数的函数.在文件编辑器中输入这个例子: def hello(name): print('He ...
- [C++] Copy Control (part 1)
Copy, Assign, and Destroy When we define a class, we specify what happens when objects of the class ...
- C中文件操作的文本模式和二进制模式,到底有啥区别?
在C中,使用fopen打开文件有两种模式:一种是文本模式,一种是二进制模式.那这两种模式之间有什么区别,是不是使用文本模式打开的文件就只能使用文本函数比如fprintf来操作,而使用二进制打开的文件就 ...
- 词频统计 SPEC 20170914 1 1 1 1 1
功能1 小文件输入,为表明程序能跑,结果真实而不是迫害老五,请他亲自键盘在控制台下输入命令. #include<stdio.h> #include<string.h> #inc ...
- Windows SDK 非模态对话框的消息处理
在SDK中使用非模态对话框时的几个问题: 1.为什么要调用IsDialogMessage?? 2.非模态对话框与主窗口有什么区别? 3.如果不调用IsDialogMessage,消息能不能传递到对话框 ...
- iOS-UISearchController用法
import "ViewController.h" @interface ViewController ()<UITableViewDelegate,UITableViewD ...
- 基于gulp的前端自动化开发构建
就前端的发展而言会越来越朝着后端的标准化靠近,后端的工程化以及模块化都很成熟.基于这样一个思路,开始探索如何优化目前的开发流程.而使用的工具就是gulp. 个人觉得gulp比较webpack更为简单实 ...
- Jenkins系列-Jenkins插件下载镜像加速
可供选择的jenkins2 插件镜像列表: Jenkins 所有镜像列表: http://mirrors.jenkins-ci.org/status.html比如日本的镜像: http://mirro ...
- 关于设置Visaul Studio 2010 代码编辑界面背景的方法
1.打开代码编辑界面: 2.找到工具--选项: 3.打开选项后选中纯文本--项背景色: 4.点击自定义,找到自己需要的颜色: [注]: “项前景色”即代码的颜色: “项背景色”即背景颜色. 设置好后, ...