首页 > 其他分享 >题解 P8670 [蓝桥杯 2018 国 B] 矩阵求和

题解 P8670 [蓝桥杯 2018 国 B] 矩阵求和

时间:2023-09-22 15:01:54浏览次数:51  
标签:lfloor mu P8670 frac int 题解 sum rfloor 蓝桥

题目描述

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

具体思路

solution 1

显然可以每次枚举 \(\gcd(i,j)\) 的取值。

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

令 \(i=\lfloor \frac{i}{k} \rfloor\),\(j=\lfloor \frac{j}{k} \rfloor\)。

\[\sum_{k=1}^n k^2 \sum_{i=1}^{\lfloor \frac{n}{k} \rfloor} \sum_{j=1}^{\lfloor \frac{n}{k} \rfloor} [\gcd(i,j)=1] \]

\[\sum_{k=1}^n k^2 \sum_{i=1}^{\lfloor \frac{n}{k} \rfloor} \sum_{j=1}^{\lfloor \frac{n}{k} \rfloor} \varepsilon(\gcd(i,j)) \]

然后进行莫比乌斯反演。

\[\sum_{k=1}^n k^2 \sum_{i=1}^{\lfloor \frac{n}{k} \rfloor} \sum_{j=1}^{\lfloor \frac{n}{k} \rfloor} \sum_{d \mid \gcd(i,j)} \mu(d) \]

\[\sum_{k=1}^n k^2 \sum_{i=1}^{\lfloor \frac{n}{k} \rfloor} \sum_{j=1}^{\lfloor \frac{n}{k} \rfloor} \sum_{d \mid i,d \mid j} \mu(d) \]

交换求和顺序,由于先枚举 \(i,j\) 再枚举 \(d\),此时 \(d\) 是 \(i,j\) 的约数,因此反过来先枚举 \(d\) 再枚举 \(i,j\),此时 \(i,j\) 就是 \(d\) 的倍数。而 \(1 \sim \lfloor \frac{n}{k} \rfloor\) 里面 \(d\) 的倍数有 \(\lfloor \frac{n}{kd} \rfloor\) 个。

\[\sum_{k=1}^n k^2 \sum_{d=1}^{\lfloor \frac{n}{k} \rfloor} \mu(d) \sum_{i=1}^{\lfloor \frac{n}{kd} \rfloor} \sum_{j=1}^{\lfloor \frac{n}{kd} \rfloor} 1 \]

\[\sum_{k=1}^n k^2 \sum_{d=1}^{\lfloor \frac{n}{k} \rfloor} \mu(d) \lfloor \frac{n}{kd} \rfloor \lfloor \frac{n}{kd} \rfloor \]

令:

\[f(n)=\sum_{d=1}^n \mu(d) \lfloor \frac{n}{d} \rfloor \lfloor \frac{n}{d} \rfloor \]

有:

\[\sum_{k=1}^n k^2 f(\lfloor \frac{n}{k} \rfloor) \]

显然 \(f(n)\) 可以数论分块解决,而最后的式子也可以数论分块解决,即数论分块套数论分块。

时间复杂度

\[O(\sum_{i=1}^{\sqrt n} \sqrt \frac{n}{i})=O(\sqrt n\int_0^{\sqrt n} i^{-\frac{1}{2}})=O(n^{\frac{3}{4}}) \]

这个复杂度跑 \(1e7\) 还是挺轻松的。

Code

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=1e7;
const int mod=1e9+7;
int v[N+5],prime[N+5],pr;
int mu[N+5];LL sum[N+5];
LL qpow(LL a,LL b){
	LL ans=1%mod;a%=mod;
	while(b){
		if(b&1)ans=ans*a%mod;
		a=a*a%mod;b>>=1;
	}
	return ans;
}
void init(int n){
	memset(v,0,sizeof(v));pr=0;
	mu[1]=1;
	for(int i=2;i<=n;i++){
		if(!v[i]){
			prime[++pr]=i;
			mu[i]=-1;
		}
		for(int j=1;j<=pr&&i*prime[j]<=n;j++){
			v[i*prime[j]]=1;
			if(i%prime[j]==0){
				mu[i*prime[j]]=0;
				break;
			}
			mu[i*prime[j]]=-mu[i];
		}
	}
	for(int i=1;i<=n;i++){
		sum[i]=(sum[i-1]+mu[i])%mod;
	}
}
LL block(LL n){
	LL ans=0;
	for(LL l=1,r=0;l<=n;l=r+1){
		r=n/(n/l);
		ans=(ans+(sum[r]-sum[l-1])%mod*(n/l)%mod*(n/l)%mod+mod)%mod; 
	}
	return ans;
}
LL f(LL n){
	return n*(n+1)%mod*(2*n+1)%mod*qpow(6,mod-2);
}
LL calc(LL n){
	LL ans=0;
	for(LL l=1,r=0;l<=n;l=r+1){
		r=n/(n/l);
		ans=(ans+(f(r)-f(l-1))%mod*block(n/l)%mod+mod)%mod;
	}
	return ans;
}
int main(){
	LL n;scanf("%lld",&n);
	init(n);
	printf("%lld\n",calc(n));
	return 0;
}

标签:lfloor,mu,P8670,frac,int,题解,sum,rfloor,蓝桥
From: https://www.cnblogs.com/reclusive2007/p/17722370.html

相关文章

  • 【UVA 11175】From D to E and Back 题解(图论)
    取具有n个顶点和m条边的任意有向图D。你可以在以下方式。E将有m个顶点,每个顶点对应于D的每条边。例如,如果D有一条边uv,那么E将有一个叫做uv的顶点。现在,每当D有边uv和vw时,E就会有边顶点uv到顶点vw。E中没有其他边。你将得到一张E图,并且必须确定E是否有可能是某些有向图D的图的卧......
  • CF38H 题解
    problem&blog。远古场翻到的一个不错的题,提供一个好想很多的做法。求出任意两点的路径在全部路径中是第几个。然后随便找两个人,钦定他们是Au吊车尾与CuRank1。这样子就可以直接求出全部人可以是否可以拿AuAgCu了。然后就是傻子DP了,往状态里塞Au与Ag的人数,转移......
  • MUH and Cube Walls 题解
    MUHandCubeWalls前言怎么题解区同质化这么严重,16篇题解全是差分+KMP,就没有人写别的做法吗。(好吧其实是我一开始没想到差分才有了这么多奇怪做法)题目大意给定两个序列\(a,b\),求\(b\)在\(a\)中出现了多少次。我们定义\(b\)在\(a\)的出现次数为:\[\sum_{i=1}^n......
  • c#Winform窗体实际运行大小与size属性设置不一致问题解决
    privatevoidForm1_Load(objectsender,EventArgse){RectangleScreenArea=System.Windows.Forms.Screen.GetWorkingArea(this);//GetWorkingArea()检索显示器的工作区(工作区是显示器的桌面区域,不包括边界、标题栏、任务栏、停靠窗口和停靠......
  • vue学习问题解决
    报错errorComponentname"Index"shouldalwaysbemulti-wordvue/multi-word-component-names解决方法1、问题说明:在创建组件命名时,引用index.vue的过程中报错;2、报错的原因及分析:其一、报错的全称为:errorComponentname"index"shouldalwaysbemulti-wordvue/multi-w......
  • 容斥原理应用Acwing890借鉴题解
    参考文献简单的容斥原理介绍请看下图:C++代码简单的容斥原理介绍请看下图:本题思路:将题目所给出的m个数可以看成是m位的二进制数,例如当p[N]={2,3}时,此时会有01,10,11三种情况而二进制的第零位表示的是p[0]上面的数字2,第1位表示p[1]上面的数字3所以当i=1时表示只选择2的......
  • 题解 ARC141D【Non-divisible Set】
    这个题不是网络流。problem我们说一个集合\(D\)是一个好的集合,当不存在集合中的两个不同元素\(a,b\)使得\(a\)是\(b\)的约数。给定\(N\)个整数的一个集合\(S\),值域均落在\([1,2*M]\)内。对\(S\)中的每个元素\(A_i\)询问:是否存在一个恰好包含\(A_i\)的\(......
  • Little Victor and Set 题解
    LittleVictorandSet题目大意在\([l,r]\)中选不超过\(k\)个相异的数使得异或和最小,输出方案。思路分析分类讨论:当\(k=1\)时:显然选\(l\)是最优的。当\(r-l+1\le10\)时:直接\(O(n2^n)\)暴力枚举每个数选或不选即可。(判了这个之后后面的很多讨论会简单很......
  • docker搭建青龙面板及白屏问题解决方法
    最近也是想赚点小钱,搭建个青龙面包来挂脚本,但是在搭建过程中遇到过一些问题,所以记录下来。docker搭建青龙面板我这里是使用aliyun服务器进行搭建的,系统是centOS7.6版本。另外docker自行搜索安装即可。拉取青龙面板镜像远程登录服务器,输入命令拉取青龙镜像dockerpullwhyour......
  • 题解 P9019 [USACO23JAN] Tractor Paths P
    显然,对于给定的\(l,r\),最短路可以贪心求出,即每次走与当前区间相交且左端点最大的区间,这个可以用倍增加速。定义\(f_{i,j}\)表示从区间\(i\)往右走\(j\)步后到达的区间,\(g_{i,j}\)表示往左走的情况。正反遍历一下即可求出\(f_{i,1}\)和\(g_{i,1}\)。对于第二问,第\(i......