参考:http://blog.csdn.net/qq_33229466/article/details/70174227

看这个等式的形式就像高精gcd嘛…所以随便算一下就发现每次修改(a,b)影响到的都是横纵坐标gcd为gcd(a,b)的,进而发现可以把gcd(i,j)==d的一部分都归到d上,f(a,b)=f(d,d)ab/d/d ,这样二维就变成一维了,设为f。

然后答案就是:

\[ans=\sum_{d=1}^{k}f(d)\sum_{i=1}^{k}\sum_{j=1}^{k}[gcd(i,j)==d]\frac{i*j}{d^2}
\]

\[ans=\sum_{d=1}^{k}f(d)\sum_{i=1}^{\frac{k}{d}}\sum_{j=1}^{\frac{k}{d}}[gcd(i,j)==1]i*j
\]

\[s(n)=\sum_{i=1}^{n}\sum_{j=1}^{n}[gcd(i,j)==1]i*j=\sum_{i=1}^{n}\varphi(i)i^2
\]

\[ans=\sum_{d=1}^{k}f(d)s(\frac{n}{d})
\]

(f应该先按照原始状态写出来

因为m比n小很多,所以用分块维护即可

#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
const int N=4000005,mod=1000000007;
int m,n,t[N],phi[N],q[N],tot,inv[N],f[N],w[N],c[N],kuai,lz[N];
bool v[N];
int read()
{
int r=0,f=1;
char p=getchar();
while(p>'9'||p<'0')
{
if(p=='-')
f=-1;
p=getchar();
}
while(p>='0'&&p<='9')
{
r=r*10+p-48;
p=getchar();
}
return r*f;
}
int gcd(int a,int b)
{//cout<<"gcd"<<endl;
return b==0?a:gcd(b,a%b);
}
void add(int x,int v)
{//cout<<"add"<<endl;
for(int i=x;i<=(x+kuai-1)/kuai*kuai;i++)
w[i]=((w[i]+v)%mod+mod)%mod;
for(int i=(x+kuai-1)/kuai+1;i<=(n+kuai-1)/kuai;i++)
lz[i]=((lz[i]+v)%mod+mod)%mod;
}
int ques(int x)
{//cout<<"ques"<<endl;
int re=0;
for(int i=1,la;i<=x;i=la+1)
{
la=x/(x/i);
re=(re+1ll*(w[la]+lz[(la+kuai-1)/kuai]-w[i-1]-lz[(i+kuai-2)/kuai])%mod*f[x/i]%mod)%mod;
}
return (re+mod)%mod;
}
int main()
{
m=read(),n=read();
kuai=sqrt(n);
v[1]=1,phi[1]=1;
for(int i=2;i<=n;i++)
{
if(!v[i])
{
q[++tot]=i;
phi[i]=i-1;
}
for(int j=1;j<=tot&&i*q[j]<=n;j++)
{
int k=i*q[j];
v[k]=1;
if(i%q[j]==0)
{
phi[k]=phi[i]*q[j];
break;
}
phi[k]=phi[i]*(q[j]-1);
}
}
for(int i=1;i<=n;i++)
f[i]=(f[i-1]+1ll*i*i%mod*phi[i]%mod)%mod;
for(int i=1;i<=n;i++)
w[i]=(w[i-1]+1ll*i*i%mod)%mod,c[i]=1ll*i*i%mod;
while(m--)
{
int a=read(),b=read();
long long x;
scanf("%lld",&x);
int k=read(),g=gcd(a,b),gai=1ll*x/(a/g)/(b/g)%mod;
add(g,((gai-c[g])%mod+mod)%mod);
c[g]=gai;
printf("%d\n",ques(k));
}
return 0;
}

bzoj 4815: [Cqoi2017]小Q的表格【欧拉函数+分块】的更多相关文章

  1. BZOJ 4815 CQOI2017 小Q的表格 欧拉函数+分块

    题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=4815 题意概述:要认真概述的话这个题就出来了... 分析: 首先分析题目,认真研究一下修 ...

  2. BZOJ 4815 [Cqoi2017]小Q的表格 ——欧拉函数

    把式子化简一波. 发现一个比较厉害的性质:每个点只能影响到行列下标$gcd$与它相同的点. 然后就可以计算$\sum_{g<=k}f(g,g)*\sum_{i<=k}\sum_{j< ...

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

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

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

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

  5. 【BZOJ】2005: [Noi2010]能量采集(欧拉函数+分块)

    http://www.lydsy.com/JudgeOnline/problem.php?id=2005 首先和某题一样应该一样可以看出每个点所在的线上有gcd(x,y)-1个点挡着了自己... 那么 ...

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

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

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

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

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

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

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

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

随机推荐

  1. 线程&线程池

    线程 进程和线程: 进程只是用来把资源集中到一起(进程只是一个资源单位,或者说资源集合),而线程才是cpu上的执行单位. 注意:两个都是过程 线程一个特点: 一个进程中,多个线程共享资源 线程和进程区 ...

  2. iOS FMDB 无法更新二进制数据的问题

    使用FMDB很方便的实现了(通过数据库字段名而不是字段索引)数据的读取,插入,更新,删除.但是我在更新图片时发现通过格式化字符(@“%@”,data/NSData/)传入的二进制数据更新到数据库后不能 ...

  3. Fibonacci--poj3070(矩阵快速幂)

    http://poj.org/problem?id=3070 Description In the Fibonacci integer sequence, F0 = 0, F1 = 1, and Fn ...

  4. 【Perl】perl正则表达式中的元字符、转义字符、量词及匹配方式

    Linux平台上被广泛使用的正则表达式库PCRE - Perl-compatible regular expressions,从其名字即可知道,PCRE提供的是一套与Perl中相兼容的正则表达式. 元 ...

  5. Python的字符串和列表和字典的方法/函数

    字符串 S.find()#可指定范围查找字串,返回索引值,否则返回-1 S.index()#同find,只是找不到的之后返回异常 S.count()#返回找到字串的个数 S.lower()#转小写 S ...

  6. url优化|隐藏index.php

    隐藏index.php   一.codeigniter codeigniter和许多php框架一样,有个单一入口index.php,从url上看,显得很不友好.通过apache的rewirte,是可以 ...

  7. windows下的两个等待函数

    windows下的两个等待技术 第一种: Win32  Sleep()函数      这个函数要求操作系统中止线程动作.直到读过某个指定的时间之后才恢复.能在某个线程结束时(而不是某段时间结束时)被调 ...

  8. 2016/05/17 thinkphp3.2.2 ① Ajax 使用 ②前端验证

    显示效果: ①Ajax使用:   注意传值的所有过程用的是小写,及时数据库列的名称中有大写字母 控制器部分: AjaxController.class.php <?php namespace H ...

  9. 下面forward和redirect的描述,正确的是(ABCD)

    A:forward是服务器将控制权转交给内部服务器对象,由新的对象来全权负责响应用户的请求 B:执行forward时,浏览器不知道服务器所发送的内容从那里来,浏览器地址栏中还是原来的地址 C:执行re ...

  10. PS人物脸部去高光简单之法

    案例素材图: 方法原理步骤:得到高光面的选区,然后吸取高光面附近的颜色填充上去,这样就达到了去高光的效果. 得到高光选区的方法有很多种,要提取这种选区,通过阿尔法通道是最合适不过的了,本案例就通过阿尔 ...