解题:CQOI 2017 小Q的表格
首先观察$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的表格的更多相关文章
- 解题:CQOI 2017 小Q的棋盘
题面 由树的结构我们可以知道,最终要么是连一条(最长的)链都没走完,要么是走了一些点最后走了最长的链.为什么总是说最长的链呢,因为在树上这样走的过程中(最后不要求返回的话)除了一条链都会被走两次,显然 ...
- bzoj 4815: [Cqoi2017]小Q的表格 [数论]
4815: [Cqoi2017]小Q的表格 题意: 单点修改,查询前缀正方形和.修改后要求满足条件f(a,b)=f(b,a), b×f(a,a+b)=(a+b)*f(a,b) 一开始sb了认为一次只会 ...
- 【CQOI2017】小Q的表格
[CQOI2017]小Q的表格 稍加推导就会发现\(f(a,b)=a\cdot b\cdot h(gcd(a,b))\). 初始时\(h(n)=1\). 询问前\(k\)行\(k\)列时我们就反演: ...
- 【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][CQOI2017]小Q的表格(莫比乌斯反演)
4815: [Cqoi2017]小Q的表格 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 832 Solved: 342[Submit][Statu ...
- 【LOJ】#3020. 「CQOI2017」小 Q 的表格
#3020. 「CQOI2017」小 Q 的表格 这个的话求出来\(g = gcd(a,b)\) 会修改所有gcd为g的位置 我们要求\((g,g)\)这个位置的数一定是\(g^{2}\)的倍数 之后 ...
- [bzoj4815]: [Cqoi2017]小Q的表格
来自FallDream的博客,未经允许,请勿转载,谢谢. 小Q是个程序员. 作为一个年轻的程序员,小Q总是被老C欺负,老C经常把一些麻烦的任务交给小Q来处理.每当小Q不知道如何解决时,就只好向你求助. ...
- [CQOI2017]小Q的表格(数论+分块)
题目描述 小Q是个程序员. 作为一个年轻的程序员,小Q总是被老C欺负,老C经常把一些麻烦的任务交给小Q来处理.每当小Q不知道如何解决时,就只好向你求助. 为了完成任务,小Q需要列一个表格,表格有无穷多 ...
随机推荐
- java 实现验证码功能
所需文件以及技术: · SecurityUtil.java (后面我会复制给大家) · 图像处理技术 · 向客户端输出io流 一,实现的原理,当视图页面加载的时候通过<img >元素的 ...
- MyForm_参考django的Form组建
fork wupeiqi:https://github.com/fat39/Tyrion 组件说明:https://www.cnblogs.com/wupeiqi/p/5938916.html
- sqlplus远程连接oracle
格式: sqlplus 用户名/密码@192.168.19.189:1521/MYTEST MYTEST 数据库名称
- 移动设备检测类Mobile_Detect.php
移动设备检测类Mobile_Detect.php http://mobiledetect.net/ 分类:PHP 时间:2015年11月28日 Mobile_Detect.php是一个轻量级的开源移动 ...
- sprint2(第三天)
展板 燃尽图
- 《Spring2之站立会议1》
<Spring2之站立会议1> 昨天,查找了关于建立起服务器和客户端两端的连接的资料,并学习了如何写把两者建立起来的代码: 今天,模仿着相关资料,分别写了客户端和服务器两端的代码: 遇到的 ...
- GIT理解
以前从来没听过GIT,根本不知道是什么东西.老师突然让注册一个GIT帐号,不知道怎么注册, 真有点不知所措了,又听说是全英文的,感觉也是醉了!登录进去看了看,看的似懂非懂,自己 也不敢妄下定论于是上网 ...
- Leetcode题库——14.最长公共前缀
@author: ZZQ @software: PyCharm @file: longestCommonPrefix.py @time: 2018/9/16 17:50 要求:查找字符串数组中的最长公 ...
- 【贪心算法】POJ-1862 简单哈夫曼
一.题目 Description Our chemical biologists have invented a new very useful form of life called stripie ...
- 关于char存储值表示
char里面-128的二进制表示为1000 0000,0的二进制表示为0000 0000 -127的二进制表示为1000 0001, 127的二进制表示为0111 1111. 从-127到-1和1到1 ...