题面

首先观察$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. openstack horizon开发第一天

    horizon插件构造 创建一个dashboardmkdir opesntack_dashboard/dashboards/mydashboardpython manage.py startdash ...

  2. POJ 3468 A Simple Problem with Integers(分块入门)

    题目链接:http://poj.org/problem?id=3468 A Simple Problem with Integers Time Limit: 5000MS   Memory Limit ...

  3. Mac下基于testrpc和truffle的以太坊智能合约开发环境搭建

    原文地址:石匠的blog truffle是一个基于Javascript开发的一套智能合约开发框架,使用Solidity语言编写合约.truffle有一套自动的项目构建机制,集成了开发,测试和部署的各个 ...

  4. Windows搭建python开发环境

    python你不去认识它,可能没什么,一旦你认识了它,你就会爱上它 基本概念Python(英语发音:/ˈpaɪθən/), 是一种面向对象.解释型计算机程序设计语言,由Guido van Rossum ...

  5. AloneQIan---第一次作业

    小学生的噩梦 一.估计与实际 PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟) Planning 计划 600 720 • Estim ...

  6. [2017BUAA软工]结对项目:数独扩展

    结对项目:数独扩展 1. Github项目地址 https://github.com/Slontia/Sudoku2 2. PSP估计表格 3. 关于Information Hiding, Inter ...

  7. 我的JAVA运算符理解

    基本概念 原码,反码,补码 只需要记住这几句就够了  1.二进制的最高位是符号位:0表示正数,1表示负数 2.正数的原码,反码,补码都一样 3.负数的反码=它的原码符号位不变,其他位取反 4.负数的补 ...

  8. Docker基础教程

    一.Docker是什么? KVM, Virtualbox, Vmware是虚拟出机器,让每个实例看到一个单独的机器:而Docker是虚拟出操作系统,实现应用之间的隔离,让各个应用觉得自己有一个自己的操 ...

  9. 记:ASP.NET Core开发时部署到IIS上出现HTTP Error 502.5 - Process Failure的解决方案

    HTTP Error 502.5 - Process Failure Common causes of this issue: The application process failed to st ...

  10. 个人作业-Week 2

    一.代码复审 概要部分 代码能符合需求和规格说明么? 能: 代码设计是否有周全的考虑? 有较为周全的考虑: 代码可读性如何? 可读性一般: 代码容易维护么? 不太容易维护: 代码的每一行都执行并检查过 ...