ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

P1447 [NOI2010] 能量采集(莫比乌斯反演)

2021-05-17 18:58:23  阅读:203  来源: 互联网

标签:P1447 gcd limits int res sum mu 反演 NOI2010


题目传送门

题意:在一个 n ∗ m n*m n∗m的矩阵上,将每个点和点 ( 0 , 0 ) (0,0) (0,0)连起来,假设线段上除了两端点有 k k k个点,这个点的贡献是 2 ∗ k + 1 2*k+1 2∗k+1,求这 n ∗ m n*m n∗m个点的贡献和。

思路:可以知道,假设有点 ( i , j ) (i,j) (i,j), ( i , j ) (i,j) (i,j)的贡献是 2 ∗ g c d ( i , j ) − 1 2*gcd(i,j)-1 2∗gcd(i,j)−1。那么答案显而易见:
a n s = ∑ i = 1 n ∑ j = 1 m ( 2 ∗ g c d ( i , j ) − 1 ) = 2 ∗ ∑ i = 1 n ∑ j = 1 m ( g c d ( i , j ) ) − n ∗ m = 2 ∗ ∑ g = 1 m i n ( n , m ) g ∗ ∑ i = 1 n ∑ j = 1 m [ g c d ( i , j ) = g ] − n ∗ m \begin{aligned}\\ ans&=\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{m}(2*gcd(i,j)-1)\\ &=2*\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{m}(gcd(i,j))-n*m\\ &=2*\sum\limits_{g=1}^{min(n,m)}g*\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{m}[gcd(i,j)=g]-n*m \end{aligned} ans​=i=1∑n​j=1∑m​(2∗gcd(i,j)−1)=2∗i=1∑n​j=1∑m​(gcd(i,j))−n∗m=2∗g=1∑min(n,m)​g∗i=1∑n​j=1∑m​[gcd(i,j)=g]−n∗m​

然后上面这个式子就可以 O ( n n ) O(n\sqrt n) O(nn ​)求了。

C o d e Code Code

// Author : ACfunhsl
// Time : 2021/5/17 14:13:11
#define int long long
const int N = 1e5+50;
const int inf = 0x3f3f3f3f;
const int mod = 1e9+7;
bool ok[N];
int p[N],cnt=0,mu[N];
void euler()
{
	mu[1] = 1;
	for(int i=2;i<N;i++)
	{
		if(!ok[i])
		{
			p[++cnt] = i;
			mu[i] = -1;	
		}
		for(int j=1;j<=cnt&&i*p[j]<N;j++)
		{
			ok[i*p[j]] = 1;
			if(i%p[j]==0)
			{
				mu[i*p[j]] = 0;
				break;
			}
			else mu[i*p[j]] = -mu[i];
		}
	}
	for(int i=1;i<N;i++)
		mu[i] += mu[i-1];
}
int k;
int cal(int n,int m)
{
	n/=k;m/=k;
	int mi = min(n,m),res = 0;
	for(int l=1,r;l<=mi;l=r+1)
	{
		r = min(n/(n/l),(m/(m/l)));
		res += (n/l)*(m/l)*(mu[r] - mu[l-1]);
	}
	return res;
}
signed main()
{
	euler();
	int n,m;
	cin>>n>>m;
	int res = 0;
	for(int i=1;i<=min(n,m);i++)
	{
		k = i;
		res += cal(n,m) * k;
	}
	res = res * 2 - n*m;
	cout<<res<<endl;
	return 0;
}

标签:P1447,gcd,limits,int,res,sum,mu,反演,NOI2010
来源: https://blog.csdn.net/Joker_He/article/details/116943541

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有