BZOJ 4815 [Cqoi2017]小Q的表格 ——欧拉函数
把式子化简一波。
发现一个比较厉害的性质:每个点只能影响到行列下标$gcd$与它相同的点。
然后就可以计算$\sum_{g<=k}f(g,g)*\sum_{i<=k}\sum_{j<=k}[gcd(i,j)==g](i/g)*(i/g)$
然后考虑它的意义,直接发现计算出$i*i*\phi(i)$的前缀和就可以下界函数分块计算了。
这样子还是过不了。考虑修改次数比较少,考虑分块维护,就可以$O(1)$查询了。
复杂度$m\sqrt {n}$
#include <map>
#include <cmath>
#include <queue>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define F(i,j,k) for (ll i=j;i<=k;++i)
#define D(i,j,k) for (ll i=j;i>=k;--i)
#define ll long long
#define mp make_pair const ll md=1000000007; void Finout()
{
freopen("table.in","r",stdin);
freopen("table.out","w",stdout);
} #define maxn 10000001
int a[maxn],phi[maxn],f[maxn];
int vis[maxn],pri[maxn],top=0,m,n; ll Getll()
{
ll x=0,f=1; char ch=getchar();
while (ch<'0'||ch>'9') {if (ch=='-') f=-1; ch=getchar();}
while (ch>='0'&&ch<='9') {x=x*10+ch-'0'; ch=getchar();}
return x*f;
} void Shaker()
{
phi[1]=1;
F(i,2,n)
{
if (!vis[i]) pri[++top]=i,phi[i]=i-1;
for (ll j=1;j<=top&&(ll)i*pri[j]<=(ll)n;++j)
{
vis[i*pri[j]]=1;
if (i%pri[j]==0)
{
phi[i*pri[j]]=phi[i]*pri[j];
break;
}
else phi[i*pri[j]]=phi[i]*phi[pri[j]];
}
}
F(i,1,maxn-1) phi[i]=phi[i]*i%md*i%md+phi[i-1],phi[i]%=md;
} int sum[50005],pre[maxn];
int L[50005],R[50005],bel[maxn],T,tot=0; void add(ll x,ll d)
{
F(i,x,R[bel[x]])
{
pre[i]+=d,pre[i]%=md;
}
F(i,bel[x],tot)
{
sum[i]+=d,sum[i]%=md;
}
} ll gs(ll x)
{
if (x==0) return 0;
ll ret=0;
ret=sum[bel[x]-1]+pre[x];
ret%=md;
return ret;
} ll gcd(ll a,ll b)
{return b==0?a:gcd(b,a%b);} ll cal(ll k)
{
ll ret=0;
for (ll i=1,last=0;i<=k;i=last+1)
{
last=k/(k/i);
ret+=phi[k/last]*((gs(last)-gs(i-1))%md);
ret%=md;
}
return (ret+md)%md;
} void init()
{
T=sqrt(n); //printf("Block Size is %d\n",T);
for (ll i=1;i<=n;i+=T)
{
L[++tot]=i;
R[tot]=i+T-1;
}
R[tot]=n;
F(i,1,tot) F(j,L[i],R[i]) bel[j]=i;
} int main()
{
m=Getll();n=Getll();
init();
Shaker();
F(i,1,n) a[i]=((ll)i*i)%md;
F(i,1,n) (a[i]+=a[i-1])%=md;
F(i,1,tot) sum[i]=a[R[i]];
F(i,1,tot)
{
pre[L[i]]=(a[L[i]]-a[L[i]-1])%md;
F(j,L[i]+1,R[i]) pre[j]=(pre[j-1]+a[j]-a[j-1])%md;
}
sum[0]=0;
F(i,1,m)
{
ll a,b,k,x;
a=Getll();b=Getll();x=Getll();k=Getll();
ll g=gcd(a,b);
add(g,-gs(g)+gs(g-1));
ll tmp=x/(a/g)/(b/g);
tmp%=md;
add(g,tmp);
printf("%lld\n",cal(k));
}
}
BZOJ 4815 [Cqoi2017]小Q的表格 ——欧拉函数的更多相关文章
- BZOJ 4815 CQOI2017 小Q的表格 欧拉函数+分块
题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=4815 题意概述:要认真概述的话这个题就出来了... 分析: 首先分析题目,认真研究一下修 ...
- 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 大概就是推式子的时候注意有两个边界都是 n ,考虑变成 2*... 之类的. 分块维护 ...
- 4815: [Cqoi2017]小Q的表格 莫比乌斯反演 分块
(Updated 2018.04.28 : 发现公式效果不好,重新处理图片)国际惯例的题面:看到这两个公式,很多人都会想到与gcd有关.没错,最终的结论就是f(a,b)=f(gcd(a,b))*(a/ ...
- [BZOJ4815][CQOI2017]小Q的表格(莫比乌斯反演)
4815: [Cqoi2017]小Q的表格 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 832 Solved: 342[Submit][Statu ...
- 【BZOJ4815】[CQOI2017]小Q的表格(莫比乌斯反演,分块)
[BZOJ4815][CQOI2017]小Q的表格(莫比乌斯反演,分块) 题面 BZOJ 洛谷 题解 神仙题啊. 首先\(f(a,b)=f(b,a)\)告诉我们矩阵只要算一半就好了. 接下来是\(b* ...
- 洛咕 P3700 [CQOI2017]小Q的表格
洛咕 P3700 [CQOI2017]小Q的表格 神仙题orz 首先推一下给的两个式子中的第二个 \(b\cdot F(a,a+b)=(a+b)\cdot F(a,b)\) 先简单的想,\(F(a,a ...
- [bzoj4815] [洛谷P3700] [Cqoi2017] 小Q的表格
Description 小Q是个程序员. 作为一个年轻的程序员,小Q总是被老C欺负,老C经常把一些麻烦的任务交给小Q来处理. 每当小Q不知道如何解决时,就只好向你求助.为了完成任务,小Q需要列一个表格 ...
随机推荐
- Android 麦克风录音带音量大小动态显示的圆形自定义View
1.所谓无图无真相,先上效果图.我们要实现的就是中间那个录音的按钮,周边会显示一圈音量大小的波形 2.VolumCircleBar继承自View,我们进行了自定义,代码如下 package com.r ...
- 后台安装 SQL Server 无人值守 安装
(开头闲淡)项目需要必须安装SQL的,查了很久,断断续续用了各种方法,今天终于用了正确的姿(xia)势(mo)弄成了. 最开始用的方法是调用Win的API模拟鼠标操作安装的,嗯,虽然勉强可以,就是有些 ...
- OPENFIRE 接收数据流程图
此图网上已经有,怎奈我不能上传大于10M的图片,所以截图了!各位请脑补!
- bzip2命令
bzip2命令——压缩文件 命令所在路径:/usr/bin/bzip2 示例1: # bzip2 yum.log 压缩当前目录下yum.log文件成yum.log.bz2 示例2: # bzip2 - ...
- 如何让Sublime Text编辑器支持新的ABAP关键字
ABAP 7.40推出了许多新的关键字 - keyword,您的Sublime Text可能无法针对这些新关键字实现期望的语法高亮显示(syntax highlight)或者自动完成(auto com ...
- codeforce Gym 100203I I WIN (网络流)
把'I'拆成容量为1一条边,一个入点一个出点,入点和相邻的'W'连一条容量为1的边,出点和相邻的'N'连一条容量为1,所有的'W'和源点连一条容量为1边,所有的'N'和汇点连一条容量为1的边,表示只能 ...
- synchronized关键字修饰非静态方法与静态方法的区别
这里我们先创建ObjLock类,并实现Runnable接口.并创建一个Demo类,具有被synchronized关键字修饰的非静态方法与静态方法. 非静态方法 public class ObjLock ...
- C++函数调用过程深入分析<转>
转自http://blog.csdn.net/dongtingzhizi/article/details/6680050 C++函数调用过程深入分析 作者:靠谱哥 微博:洞庭之子-Bing 0. 引言 ...
- ueditor中FileUtils.getTempDirectory()找不到
2014-6-27 14:22:25 org.apache.catalina.core.StandardWrapperValve invoke SEVERE: Servlet.service() fo ...
- Lazy Instantiator
lazy instantiator (懒加载.延迟实例化.延迟初始化) 最开始看斯坦福的视频,对 延迟初始化 这个概念,不太理解 只见到,有些属性的初始化是在init做的,有些是在viewDidLoa ...