zhoutb2333的题解

难得一见的新颖反演题。

一眼看可能不是反演题。

修改影响别的,很恶心。

所以考虑化简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的表格——反演好题的更多相关文章

  1. bzoj 4815 [Cqoi2017]小Q的表格——反演+分块

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4815 大概就是推式子的时候注意有两个边界都是 n ,考虑变成 2*... 之类的. 分块维护 ...

  2. 【BZOJ4815】[CQOI2017]小Q的表格(莫比乌斯反演,分块)

    [BZOJ4815][CQOI2017]小Q的表格(莫比乌斯反演,分块) 题面 BZOJ 洛谷 题解 神仙题啊. 首先\(f(a,b)=f(b,a)\)告诉我们矩阵只要算一半就好了. 接下来是\(b* ...

  3. [BZOJ4815][CQOI2017]小Q的表格(莫比乌斯反演)

    4815: [Cqoi2017]小Q的表格 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 832  Solved: 342[Submit][Statu ...

  4. bzoj 4815: [Cqoi2017]小Q的表格 [数论]

    4815: [Cqoi2017]小Q的表格 题意: 单点修改,查询前缀正方形和.修改后要求满足条件f(a,b)=f(b,a), b×f(a,a+b)=(a+b)*f(a,b) 一开始sb了认为一次只会 ...

  5. 洛咕 P3700 [CQOI2017]小Q的表格

    洛咕 P3700 [CQOI2017]小Q的表格 神仙题orz 首先推一下给的两个式子中的第二个 \(b\cdot F(a,a+b)=(a+b)\cdot F(a,b)\) 先简单的想,\(F(a,a ...

  6. [CQOI2017]小Q的表格(数论+分块)

    题目描述 小Q是个程序员. 作为一个年轻的程序员,小Q总是被老C欺负,老C经常把一些麻烦的任务交给小Q来处理.每当小Q不知道如何解决时,就只好向你求助. 为了完成任务,小Q需要列一个表格,表格有无穷多 ...

  7. [bzoj4815] [洛谷P3700] [Cqoi2017] 小Q的表格

    Description 小Q是个程序员. 作为一个年轻的程序员,小Q总是被老C欺负,老C经常把一些麻烦的任务交给小Q来处理. 每当小Q不知道如何解决时,就只好向你求助.为了完成任务,小Q需要列一个表格 ...

  8. [bzoj4815]: [Cqoi2017]小Q的表格

    来自FallDream的博客,未经允许,请勿转载,谢谢. 小Q是个程序员. 作为一个年轻的程序员,小Q总是被老C欺负,老C经常把一些麻烦的任务交给小Q来处理.每当小Q不知道如何解决时,就只好向你求助. ...

  9. 4815: [Cqoi2017]小Q的表格 莫比乌斯反演 分块

    (Updated 2018.04.28 : 发现公式效果不好,重新处理图片)国际惯例的题面:看到这两个公式,很多人都会想到与gcd有关.没错,最终的结论就是f(a,b)=f(gcd(a,b))*(a/ ...

随机推荐

  1. DP动态规划练习

    先来看一下经典的背包问题吧 http://www.cnblogs.com/Kalix/p/7617856.html  01背包问题 https://www.cnblogs.com/Kalix/p/76 ...

  2. C++复合类型(结构,共用体,枚举)

    •结构是用户定义的类型,而结构的声明定义了这种类型的数据属性. 一.关键字struct声明:   定义了一种新类型 struct inflatable{ char name[20];//结构成员 fl ...

  3. Learning Spatial-Temporal Regularized Correlation Filters for Visual Tracking---随笔

    Learning Spatial-Temporal Regularized Correlation Filters for Visual Tracking DCF跟踪算法因边界效应,鲁棒性较差.SRD ...

  4. [问题] docker: Failed to start Docker Application Container Engine.

    docker无法启动: # systemctl restart docker Job for docker.service failed because the control process exi ...

  5. UVa 340 - Master-Mind Hints 解题报告 - C语言

    1.题目大意 比较给定序列和用户猜想的序列,统计有多少数字位置正确(x),有多少数字在两个序列中都出现过(y)但位置不对. 2.思路 这题自己思考的思路跟书上给的思路差不多.第一个小问题——位置正确的 ...

  6. openstack架构

    终于正式进入 OpenStack 部分了. 今天开始,CloudMan 将带着大家一步一步揭开 OpenStack 的神秘面纱. OpenStack 已经走过了 6 个年头. 每半年会发布一个版本,版 ...

  7. Ext JS 6学习文档-第6章-高级组件

    Ext JS 6学习文档-第6章-高级组件 高级组件 本章涵盖了高级组件,比如 tree 和 data view.它将为读者呈现一个示例项目为 图片浏览器,它使用 tree 和 data view 组 ...

  8. Twaver的mono-desiner导出的json文件解析

    以画的交换机为例,其他大概都差不多. 利用Twaver做出交换机模型如图1所示,其中,每一个端口都是一个单独的对象.具体Twaver操作流程参见网址:http://twaver.servasoft.c ...

  9. PK3Err0040

    PK3Err0040 The target device is not ready for debugging. Please check your configuration bit setting ...

  10. freefcw/hustoj Install Guide

    First of all, this version hustoj is a skin and improved for https://code.google.com/p/hustoj/. So t ...