社区讨论

不用莫反暴力A了?

P1390公约数的和参与者 4已保存回复 4

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
4 条
当前快照
1 份
快照标识符
@m5do6rzy
此快照首次捕获于
2025/01/01 17:03
去年
此快照最后确认于
2025/11/04 12:05
4 个月前
查看原帖
先预处理欧拉函数,再用整除分块枚举 gcd 再用欧拉函数计算答案,时间 O(nnlogn)O(n\sqrt{n}\log n),居然 A 了?
CPP
#include<bits/stdc++.h>
using namespace std;
int n,x,a[150000],c[2000005];
bool b[2000005];
long long ans=0;
int gcd(int x,int y)
{
	return x%y==0?y:gcd(y,x%y);
}
int main()
{
	cin>>n;
	for (int i=2;i<=n;++i)
	{
		if (!b[i])
		{
			a[++a[0]]=i;
			c[i]=i-1;
		}
		for (int j=1;j<=a[0] && i*a[j]<=n;++j)
		{
			b[i*a[j]]=1;
			if (i%a[j])
			c[i*a[j]]=c[i]*c[a[j]];
			else
			{
				c[i*a[j]]=c[i]*a[j];
				break;
			}
		}
	}
	for (int k=1;k<=n;k=x+1)
	{
		x=n/(n/k);
		for (int i=2;i<=n/k;++i)
		ans+=((long long)(k+x)*(x-k+1)>>1)*c[i];
	}
	cout<<ans;
}

回复

4 条回复,欢迎继续交流。

正在加载回复...