bzoj 4815 [Cqoi2017]小Q的表格——反演+分块
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4815
大概就是推式子的时候注意有两个边界都是 n ,考虑变成 2*... 之类的。
分块维护 f[ ] 的前缀和。很好的思路是修改一个位置后前缀和数组需要区间加,整块地打上加法标记就行了。
自己本来想维护整块之间的前缀和,还有块内的前缀和;却WA得不行。之后再探究为什么WA吧。
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define ll long long
using namespace std;
const int N=4e6+,M=,mod=1e9+;
int n,g[N],phi[N],f[N],pri[N];bool vis[N];
int base,bh[N],s[M],si[M],fl[N];
void upd(int &x){while(x>=mod)x-=mod;while(x<)x+=mod;}
int gcd(int a,int b){return b?gcd(b,a%b):a;}
int pw(int x,int k)
{int ret=;while(k){if(k&)ret=(ll)ret*x%mod;x=(ll)x*x%mod;k>>=;}return ret;}
void init()
{
phi[]=g[]=; int cnt=;
for(int i=;i<=n;i++)
{
if(!vis[i])pri[++cnt]=i,phi[i]=i-;
for(int j=;j<=cnt&&(ll)i*pri[j]<=n;j++)
{
vis[i*pri[j]]=;
if(i%pri[j]==){phi[i*pri[j]]=(ll)phi[i]*pri[j]%mod;break;}
else phi[i*pri[j]]=(ll)phi[i]*phi[pri[j]]%mod;
}
g[i]=(g[i-]+(ll)i*i%mod*phi[i])%mod;//presum!!
}
base=sqrt(n);
for(int i=;i<=n;i++)f[i]=(ll)i*i%mod,fl[i]=(fl[i-]+f[i])%mod;
for(int i=,j=,k=;i<=n;i++,k++)
{
bh[i]=j;if(k==base)k=,j++;
}
/*
for(int i=1,j=1,k=base;i<=n;i++)
{
f[i]=(ll)i*i%mod;bh[i]=j;
si[j]+=f[i]; upd(si[j]); fl[i]=si[j];
if(i==k)s[j]=s[j-1]+si[j],j++,k+=base;
}
*/
}
int calc(int x){int ret=fl[x]+s[bh[x]];upd(ret);return ret;}
int main()
{
int T;scanf("%d%d",&T,&n);init();
int x,y,tn; ll w;
while(T--)
{
scanf("%d%d%lld%d",&x,&y,&w,&tn);//w not %mod!!!
int u=gcd(x,y),d=bh[u];
int tf=w/(x/u)/(y/u)%mod;//not inv /*//also ok
int chg=tf+calc(u-1)-calc(u);upd(chg);
for(int i=u;bh[i]==bh[u];i++)
fl[i]+=chg,upd(fl[i]);
for(int i=bh[u]+1;i<=bh[n];i++)//n not tn!!!
s[i]+=chg,upd(s[i]);
*/
int pl=tf-f[u];upd(pl);f[u]=tf;
for(int i=u;bh[i]==bh[u];i++)
fl[i]+=pl,upd(fl[i]);
for(int i=bh[u]+;i<=bh[n];i++)
s[i]+=pl,upd(s[i]);
/*
si[d]=si[d]-f[u]+tf;upd(si[d]);
for(int i=d;i<=bh[n];i++)
s[i]=s[i-1]+si[i],upd(s[i]);
f[u]=tf; fl[u]=(bh[u-1]==bh[u]?fl[u-1]:0)+f[u];
for(int i=u+1,j=d*base;i<=j;i++)
fl[i]=fl[i-1]+f[i],upd(fl[i]);
*/
int ans=;
for(int i=,j;i<=tn;i=j+)
{
int d=tn/i,sm=; j=tn/d;
/*
if(bh[j]-bh[i]<=1)
for(int l=i;l<=j;l++)
sm+=f[l],upd(sm);
else
{
sm=s[bh[j]-1]-s[bh[i]-1]+fl[j];
upd(sm);
if(bh[i-1]==bh[i])sm-=fl[i-1],upd(sm);
}
ans=(ans+(ll)sm*g[d])%mod;
*/
ans=(ans+(ll)(calc(j)-calc(i-))*g[d])%mod;upd(ans);
}
printf("%d\n",ans);
}
return ;
}
bzoj 4815 [Cqoi2017]小Q的表格——反演+分块的更多相关文章
- bzoj 4815: [Cqoi2017]小Q的表格 [数论]
4815: [Cqoi2017]小Q的表格 题意: 单点修改,查询前缀正方形和.修改后要求满足条件f(a,b)=f(b,a), b×f(a,a+b)=(a+b)*f(a,b) 一开始sb了认为一次只会 ...
- bzoj 4815: [Cqoi2017]小Q的表格【欧拉函数+分块】
参考:http://blog.csdn.net/qq_33229466/article/details/70174227 看这个等式的形式就像高精gcd嘛-所以随便算一下就发现每次修改(a,b)影响到 ...
- BZOJ 4815 CQOI2017 小Q的表格 欧拉函数+分块
题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=4815 题意概述:要认真概述的话这个题就出来了... 分析: 首先分析题目,认真研究一下修 ...
- BZOJ 4815 [Cqoi2017]小Q的表格 ——欧拉函数
把式子化简一波. 发现一个比较厉害的性质:每个点只能影响到行列下标$gcd$与它相同的点. 然后就可以计算$\sum_{g<=k}f(g,g)*\sum_{i<=k}\sum_{j< ...
- [CQOI2017]小Q的表格(数论+分块)
题目描述 小Q是个程序员. 作为一个年轻的程序员,小Q总是被老C欺负,老C经常把一些麻烦的任务交给小Q来处理.每当小Q不知道如何解决时,就只好向你求助. 为了完成任务,小Q需要列一个表格,表格有无穷多 ...
- bzoj 4815 小Q的表格 —— 反演+分块
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4815 思路就和这里一样:https://blog.csdn.net/leolyun/arti ...
- 4815: [Cqoi2017]小Q的表格 莫比乌斯反演 分块
(Updated 2018.04.28 : 发现公式效果不好,重新处理图片)国际惯例的题面:看到这两个公式,很多人都会想到与gcd有关.没错,最终的结论就是f(a,b)=f(gcd(a,b))*(a/ ...
- [CQOI2017]小Q的表格——反演好题
zhoutb2333的题解 难得一见的新颖反演题. 一眼看可能不是反演题. 修改影响别的,很恶心. 所以考虑化简f的联系式,发现和gcd有关 于是考虑用gcd来表示所有的gcd(a,b)=g的所有f( ...
- [BZOJ4815][CQOI2017]小Q的表格 数论+分块
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=4815 题目中所给条件中的$(a,a+b)$和$(a,b)$的关系很瞩目. 然后大家都知道$ ...
随机推荐
- mac下通过brew切换php版本
第一步,先安装 brew Brew 是 Mac 下面的包管理工具,通过 Github 托管适合 Mac 的编译配置以及 Patch,可以方便的安装开发工具. Mac 自带ruby 所以安装起来很 ...
- 同一主机,不同域名绑定不同网站(IIS主机头实现方法)
说明: 网站A域名:www.weba.com 网站A路径:D:\website\weba 网站B域名:www.webb.com 网站B路径:D:\website\webb 公用主机IP:111.222 ...
- matlab cvx工具包安装
cvx是凸函数优化的工具包 官网下载地址,http://cvxr.com/cvx/download/ 1 解压到任意文件,最好不要是matlab中的toolbox, 2 假如你解压倒了c盘sample ...
- eureka -2 - 重要配置
Server 端配置 eureka.client.registerWithEureka :是否将自己注册到Eureka Server,默认是true,如果是单节点部署,切是server端,则设置成fa ...
- js 滚到页面顶部
一.滚到顶部,且滚动中,用户滚动鼠标无效 <style> .div1, .div2, .div3, .div4 { height: 400px; width: 400px; } .div1 ...
- 通过powershell实现基础认证钓鱼获得密码
本文来自https://www.secpulse.com/archives/4131.html $cred = $host.ui.promptforcredential('Failed Authent ...
- [置顶]
不再迷惑,也许之前你从未真正懂得 Scroller 及滑动机制
学习本来就是从困惑中摸索问题答案的过程,能够描述出来问题就已经成功了一半.只要发现了困扰你的东西是什么,那么你就离解答出来不远了.----肯尼斯 R. 莱伯德 一直以来,Android 开发中绕不过去 ...
- 01-名字管理系统.py
#-*- coding:utf-8 -*- #1.打印功能提示 print("-"*50) print("名字管理系统 V8.6") print("1 ...
- 自己手写一个SpringMVC框架
前端框架很多,但没有一个框架称霸,后端框架现在Spring已经完成大一统.所以学习Spring是Java程序员的必修课. Spring框架对于Java后端程序员来说再熟悉不过了,以前只知道它用的反射实 ...
- Android Studio真机测试失败-----''No target device found" (转)
参考文章: https://blog.csdn.net/chang_sir/article/details/51755572 今天想用真机测试一个程序,却报出这样一个Error"No tar ...