题面

首先观察$b*f(a,a+b)=(a+b)*f(a,b)$这个东西

可以化成$\frac{f(a,a+b)}{a+b}=\frac{f(a,b)}{b}$,发现这类似辗转相除求gcd

而我们两边同乘一个a就能得到$\frac{f(a)}{a}$是个定值的这个结论

那么有$f(a,b)=\frac{a*b}{gcd(a,b)^2}*f(gcd(a,b),gcd(a,b))$

为了方便现在设$gcd(i,j)=g$,现在把这个东西放进原来的式子里

$\sum\limits_{i=1}^k\sum\limits_{j=1}^kf(i,j)$

$=\sum\limits_{i=1}^k\sum\limits_{j=1}^k\frac{i*j}{g^2}*f(g,g)$

改为枚举$g$,把$f(g,g)$前提

$=\sum\limits_{d=1}^kf(d,d)\sum_{d|i}\sum_{d|j}[gcd(i,j)==d]\frac{i*j}{d^2}$

熟悉的,后面改为枚举$d$

$=\sum\limits_{d=1}^kf(d,d)\sum\limits_{i=1}^{\left\lfloor\frac{k}{d}\right\rfloor}\sum\limits_{j=1}^{\left\lfloor\frac{k}{d}\right\rfloor}[gcd(i,j)==1]i*j$

开始搞后面那个玩意

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

$=2\sum_{i=1}^n\sum_{j=1}^{i}[gcd(i,j)==1]i*j-\sum_{i=1}^ni$

我们知道$n$以内$(n>=2)$和$n$互质的数的和是$\frac{n*φ(n)}{2}$
,然后$i=1$的时候就是$1$

$=\sum_{i=1}^ni^2φ(i)$

回到原来的式子

$=\sum\limits_{d=1}^kf(d,d)\sum\limits_{i=1}^{\left\lfloor\frac{k}{d}\right\rfloor}i^2φ(i)$

可做了,前面那个预处理,后面的分块

 #include<cmath>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=,Sq=,mod=1e9+;
int pri[N],npr[N],phi[N];
int blo[N],stp[Sq],edp[Sq];
int val[N],bsum[N],asum[Sq],func[N];
int a,b,k,n,m,cnt,tot,sqr; long long x,ans;
int exGCD(int a,int b,int &x,int &y)
{
if(!b) {x=,y=; return a;}
int g=exGCD(b,a%b,y,x); y-=a/b*x;
return g;
}
int GCD(int a,int b)
{
return b?GCD(b,a%b):a;
}
int Inv(int nm,int md)
{
int xx,yy;
exGCD(nm,md,xx,yy);
return (xx%md+md)%md;
}
void Prework()
{
phi[]=,npr[]=true;
sqr=sqrt(n)+,stp[cnt=]=;
for(int i=;i<=n;i++)
{
if(!npr[i])
pri[++tot]=i,phi[i]=i-;
for(int j=;j<=tot&&1ll*i*pri[j]<=n;j++)
{
npr[i*pri[j]]=true;
phi[i*pri[j]]=phi[i]*pri[j];
if(i%pri[j]) phi[i*pri[j]]-=phi[i];
else break;
}
}
for(int i=;i<=n;i++)
{
val[i]=1ll*i*i%mod,blo[i]=(i-)/sqr+;
if(i%sqr==) edp[cnt++]=i,stp[cnt]=i+;
func[i]=(func[i-]+1ll*i*i%mod*phi[i]%mod)%mod;
}
(n%sqr)?edp[cnt]=n:cnt--;
for(int i=;i<=cnt;i++)
{
bsum[stp[i]]=val[stp[i]];
for(int j=stp[i]+;j<=edp[i];j++)
bsum[j]=(bsum[j-]+val[j])%mod;
asum[i]=(asum[i-]+bsum[edp[i]])%mod;
}
}
void Change(int a,int b,int x)
{
int g=GCD(a,b),bl=blo[g],v=Inv(1ll*a*b%mod,mod);
val[g]=1ll*g*g%mod*x%mod*v%mod;
bsum[g]=(g==stp[bl])?val[g]:(bsum[g-]+val[g])%mod;
for(int i=g+;i<=edp[bl];i++)
bsum[i]=(bsum[i-]+val[i])%mod;
for(int i=bl;i<=cnt;i++)
asum[i]=(asum[i-]+bsum[edp[i]])%mod;
}
long long Query(int pos)
{
return pos?(asum[blo[pos]-]+bsum[pos])%mod:;
}
int main()
{
scanf("%d%d",&m,&n),Prework();
while(m--)
{
scanf("%d%d%lld%d",&a,&b,&x,&k);
x%=mod,Change(a,b,x),ans=;
for(int i=,j;i<=k;i=j+)
j=k/(k/i),ans+=1ll*(Query(j)-Query(i-)+mod)%mod*func[k/i]%mod,ans%=mod;
printf("%lld\n",ans);
}
return ;
}

解题:CQOI 2017 小Q的表格的更多相关文章

  1. 解题:CQOI 2017 小Q的棋盘

    题面 由树的结构我们可以知道,最终要么是连一条(最长的)链都没走完,要么是走了一些点最后走了最长的链.为什么总是说最长的链呢,因为在树上这样走的过程中(最后不要求返回的话)除了一条链都会被走两次,显然 ...

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

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

  3. 【CQOI2017】小Q的表格

    [CQOI2017]小Q的表格 稍加推导就会发现\(f(a,b)=a\cdot b\cdot h(gcd(a,b))\). 初始时\(h(n)=1\). 询问前\(k\)行\(k\)列时我们就反演: ...

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

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

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

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

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

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

  7. 【LOJ】#3020. 「CQOI2017」小 Q 的表格

    #3020. 「CQOI2017」小 Q 的表格 这个的话求出来\(g = gcd(a,b)\) 会修改所有gcd为g的位置 我们要求\((g,g)\)这个位置的数一定是\(g^{2}\)的倍数 之后 ...

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

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

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

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

随机推荐

  1. 【Ansible】ansible 任务失败控制

    任务失败控制 Ansible 通常默认会确保检测模块和命令的返回码并且会快速失败 – 专注于一个错误除非你另作打算. 有时一条命令会返回 0 但那不是报错.有时命令不会总是报告它 ‘改变’ 了远程系统 ...

  2. 如何掌握 Kubernetes ?系统学习 k8s 的大纲一份

    深度剖析 Kubernetes 深度剖析 k8s 如何学习 Kubernetes ?如何入门 Kubernetes? 为了帮帮初学者,2018 年 InfoQ 旗下(就是你知道的那个 InfoQ 哇) ...

  3. kafka consumer demo

    kafka消费者demo pom文件 <?xml version="1.0" encoding="UTF-8"?> <project xmln ...

  4. 作业 20181127-3 互评Beta版本

    此作业要求参见:https://edu.cnblogs.com/campus/nenu/2018fall/homework/2448 组名:可以低头,但没必要 组长:付佳 组员:张俊余 李文涛 孙赛佳 ...

  5. [BUAA软工]第零次博客作业---问题回答

    [BUAA软工]第0次博客作业 项目 内容 这个作业属于哪个课程 北航软工 这个作业的要求在哪里 第0次个人作业 我在这个课程的目标是 学习如何以团队的形式开发软件,提升个人软件开发能力 这个作业在哪 ...

  6. 渐入OO课的深处,探索多线程的秘密——OO第二次博客总结

    一次又一次的挑战,一次又一次全新的知识,我来到了多线程的面前 第五次作业 1.度量分析 >第五次作业由于很大程度上调用的是前两次电梯的一些代码,所以存在的问题与前几次也十分相似.同时由于第一次使 ...

  7. 20162328蔡文琛 week09 大二

    20162328蔡文琛 大二week09 教材学习内容总结 堆是一棵完全二叉树,其中每个元素大于等于其所有子节点的值. 向堆中添加一个元素的方法是,首先将这个元素添加为叶节点然后将其向上移动到合适的位 ...

  8. 软工1816 · Beta冲刺(3/7)

    团队信息 队名:爸爸饿了 组长博客:here 作业博客:here 组员情况 组员1(组长):王彬 过去两天完成了哪些任务 协助后端完成历史记录接口.美食排行榜接口 完成食堂平面图的绘制 确定web端业 ...

  9. Oracle12c 之后的路线图

    Oracle18c 以及 Oracle19c 的原始版本信息 装载一下别人的博客内容 http://www.cnblogs.com/zhjh256/p/9816499.html 感谢原作者.. 另外  ...

  10. IE实现userData 永久存储

      注意:只支持IE5,及其以上的浏览器 //需要使用 if 条件注释 <!DOCTYPE html> <html> <head> <meta charset ...