题面

首先观察$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. 三羊献瑞:next_permutation()

    三羊献瑞 观察下面的加法算式: 祥 瑞 生 辉  +   三 羊 献 瑞-------------------   三 羊 生 瑞 气 (如果有对齐问题,可以参看[图1.jpg]) 其中,相同的汉字代 ...

  2. GO/GOLANG程序员笔记大全

    ---------------------------------------- go 并发 // 注解:go 语言天生为程序并发所设计,可以说go的强项就是在cpu并发上的处理. // go 语言层 ...

  3. 笨办法学Python - 习题6-7: Strings and Text & More Printing

    目录 1.习题 6: 字符串(string) 和文本 2.加分习题: 3.我的答案 4.习题总结 5.习题 7: 更多打印 6.习题总结 1.习题 6: 字符串(string) 和文本 学习目标:了解 ...

  4. Python模块xlwt对excel进行写入操作

    python常用模块目录 1.安装 $ pip install xlwt 2.创建表格和工作表单写入内容 例子: import xlwt # 创建一个workbook 设置编码 workbook = ...

  5. [BUAA OO]第三次博客作业

    OO第三次博客作业 1. 规格化设计的发展 我认为,规格化设计主要源自于软件设计的两次危机.第一次是由于大量存在的goto语句,让当时被广泛应用的面向过程式的编程语言臃肿不堪,在逻辑性上与工程规模上鱼 ...

  6. MathExam第二次作业

    第二次作业:MathExam 一.预估与实际 PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟) Planning 计划 20 30 • ...

  7. Unity控件ScrollView使用问题记录

    Unity版本:5.6.2 控件Scroll View由4部分组成,如图: 1.含有Scroll Rect组件的根节点:Scroll View 2.含有Mask组件的节点:Viewport 3.所有内 ...

  8. keil C 51 strlen库函数使用

    在keil c51 程序中,若定义数组 volatile unsigned char  data[3]={'G','G','G'};使用strlen(&data);得到的长度是不对的,若定义v ...

  9. centos7开机出现try again to boot into default maintenance give root password for maintenance

    开启centos7出现下面两句话,然后直接输出root密码,就可以登录,但是登录后,发现一些文字显示出来的是乱码 try again to boot into default maintenanceg ...

  10. vSphere Client 连接ESXi 或者是vCenter 时虚拟机提示VMRC异常的解决办法

    1. 自己的vSphere 连接vCenter 向管理虚拟机 结果发现总是有异常. 提示如图示 VMRC控制台的连接已经断开 2. 花了比较长的时间也没搞定. 后来百度发现 关闭一个进程 然后重新登录 ...