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需要列一个表格 ...
随机推荐
- linux下phpstudy的搭建以及网站的搭建
step1: 下载SSH连接到IP地址(阿里云上购买的) step2: 安装下载phpstudywget -c http://lamp.phpstudy.net/phpstudy.bin chmod ...
- [Rational Rose 2007]解决启动报”解决无法启动此程序因为丢失suite objects.dll“的问题
问题根源1:不是丢失suite objects.dll文件,而是环境变量配置错误或无配置 假如安装目录如:C:\Program Files\Rational 需要配置环境变量的路径为:C:\Progr ...
- [Batch檔案筆記] 在UNC路徑中執行Batch檔
為了讓其他人可以免安裝又可以執行python程式所以我把python portable版本 winpython 放在samba的空間共享但是使用者如果要開 winpython cammand prom ...
- SC || 关于java迭代中修改迭代集合的操作
在通过for循环遍历整个List/Map等的时候,如果想要进行remove的操作,这时就更改了迭代集合,会出现错误 一种方法是如果只会remove一个可以remove后直接break 另一种是把集合先 ...
- js获得本季度的开始日期 结束日期
var now = new Date(); //当前日期var nowMonth = now.getMonth()+1; //当前月var nowYear = now.getFullYear(); / ...
- BXS入门赛部分writeup
pwn1 盲打(笑) 前言:没有听鱼哥的话,事先没有装好环境,于是开始没做出来,然后全程在装pwntools,经过一番努力,失败了0.0 最终在网上搜了一段python socket连接脚本,终于可 ...
- 用jquery操作xml文件
一. xml文件\内容读取 1.读取xml文件 $.get( xmlfile.xml , function (xml){ //xml即为可以读取使用的内容,具体读取见第2点 }); 2.读取xml内容 ...
- vsftp配置日志及其启用本地时间
vsftp配置日志及其启用本地时间 1. 启用vsftp日志 xferlog_enable=YES xferlog_std_format=YES xferlog_file=/var/log/xferl ...
- 详解Mac睡眠模式设置
详解Mac睡眠模式设置 原文链接:http://www.insanelymac.com/forum/index.php?showtopic=281945 需要说明的是,首先这篇文章是针对已经能够成功睡 ...
- centos下nginx安装和配置
注:此文是根据前辈的博客和自己实际动手总结出来的,不喜勿喷 1.准备工作 Nginx的安装依赖于以下三个包,意思就是在安装Nginx之前首先必须安装一下的三个包,注意安装顺序如下: 1 SSL功能需要 ...