[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/ ...
随机推荐
- 【WXS数据类型】Function
属性: 名称 值类型 说明 [Function].constructor [String] 返回值为“Function”,表示类型的结构字符串 [Function].length [Number] 返 ...
- Navicat和DBeaver的查询快捷键
1.Navicat for MySQL(连接MySQL数据库的工具) ctrl + r 执行查询页中所有的sql语句 ctrl + shift + r 只运行选中的sql语句 2.DBeaver(支持 ...
- Python全栈 项目(HTTPServer、PiP使用)
pip是Python官方推荐的包管理工具 属于python的一部分 pip的使用 pip的安装 sudo apt-get install pyt ...
- 【python 3.6】从网站抓图并存放到本地路径
#!/usr/bin/python # -*- coding: UTF-8 -*- _author_ = 'BH8ANK' import urllib.request import re import ...
- @Configuration和@Bean
@Configuration可理解为用spring的时候xml里面的标签 @Bean可理解为用spring的时候xml里面的标签 Spring Boot不是spring的加强版,所以@Configur ...
- Python3 Tkinter-Listbox
1.创建 from tkinter import * root=Tk() lb=Listbox(root) for item in ['python','tkinter','widget']: lb. ...
- HTMLTestRunner解决UnicodeDecodeError: ‘ascii’ codec can’t decode byte 0xe5 in position 108: ordinal not in range(128)
其中HTML和数据库都是设置成utf-8格式编码,插入到数据库中是正确的,但是当读取出来的时候就会出错,原因就是python的str默认是ascii编码,和unicode编码冲突,就会报这个标题错误. ...
- cookie,localstorge,sessionstorge三者总结
相同点:都是客户端存储东西的: 不同: 1大小,cookie最小;locastorge最大 2 cookie设置好会在header头里面自动带的:但是ls和ss不会:ls同个浏览下不同网页(非跨域)都 ...
- 数据库索引(结合B-树和B+树)
数据库索引,是数据库管理系统中一个排序的数据结构以协助快速查询.更新数据库表中数据.索引的实现通常使用B树及其变种B+树. 在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种 ...
- mysql入门 — (1)
使用cd进入到mysql/bin文件夹下面,或者配置完环境之后,直接在cmd中使用mysql,然后回车开启mysql. 登录 为了安全考虑,在这里只设置了本地root用户可以连接上数据库.使用的指令是 ...