[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/ ...
随机推荐
- 原生js实现轮播图原理
轮播图的原理1.图片移动实现原理:利用浮动将所有所有照片依次排成一行,给这一长串图片添加一个父级的遮罩,每次只显示一张图,其余的都隐藏起来.对图片添加绝对定位,通过控制left属性,实现照片的移动. ...
- 周期串 (Periodic Strings,UVa455)
#include<stdio.h> #include<string.h> int main(void) { int n,stlen,i,j; ]; while(scanf(&q ...
- Laxcus大数据管理系统2.0(12)- 第十章 运行
第十章 运行 本章将介绍一些Laxcus集群基本运行.使用情况,结合图片和表格表示.地点是我们的大数据实验室,使用我们的实验集群.数据来自于我们的合作伙伴,软件平台混合了Windows和Fedora ...
- springMVC第二章
springMVC第二章 一.URL 映射 可以同时设置多个URL来访问某个控制器或方法.设置value属性: @RequestMapping(value= {"/grade",& ...
- NMAP-高级用法
1.报文分段 2.偏移 –mtu后面的数字是8的倍数 3.源端口欺骗 4.指定报文长度 5.ttl 6.mac地址伪造 0代表随机伪造 7.正常输出 8.输出为xml 9.输出为grep 10.输出所 ...
- 七:HDFS Permissions Guide 权限
1.权限模式 简单:启动HDFS的操作系统用户即为超级用户,可以通过HADOOP_USER_NAME指定 kerberos: 2.group mapping 组列表由grou ...
- iconFont 阿里巴巴矢量图标使用方法
挑选图标的过程(共6步) 进入网站:Iconfont网址:http://www.iconfont.cn 点击网站上方的“官方图标库”,选择自己喜欢的图标.在这里我选择天猫的图标库. 选择好自己喜欢的图 ...
- jQuery File Upload文件上传插件简单使用
前言 开发过程中有时候需要用户在前段上传图片信息,我们通常可以使用form标签设置enctype=”multipart/form-data” 属性上传图片,当我们点击submit按钮的时候,图片信息就 ...
- lol人物模型提取(九)——终章
之前顺丰来人拍照取证了一下,又和卖家协商了一下,最后顺风只打算赔偿我23块钱的顺丰邮寄卡,就是当你寄货物的时候可以用这卡来抵邮钱.想想也没多少钱,对方也不同意微信或支付宝转账给我,索性不让顺丰公司 ...
- JS DOM(2017.12.28)
一.获得元素节点的方法 document.getElementById() 根据Id获取元素节点 document.getElementsByName() 根据name获取元素节点 遍 ...