暴力水过……
  • 板块P2568 GCD
  • 楼主STUDENT00
  • 当前回复10
  • 已保存回复10
  • 发布时间2022/10/24 21:28
  • 上次更新2023/10/27 06:04:41
查看原帖
暴力水过……
658786
STUDENT00楼主2022/10/24 21:28

此题不用杜教筛,只用欧拉函数也能过……(时间复杂度 O(nlogn)O(nlogn)

#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,A[10000010],B[10000010],f[10000010],ans;
bool noPM[10000010];
vector<int> prime;
void init(){
	for(int i=2;i*i<=n;i++){
		if(!noPM[i]){
			for(int j=i*i;j<=n;j+=i) noPM[j]=1;
		}
	}
	for(int i=2;i<=n;i++){
		if(!noPM[i]) prime.push_back(i);
	}
	return;
}
signed main(){
	scanf("%lld",&n);
	init();
	for(int i=1;i<=n;i++) A[i]=B[i]=1;
	for(int i=0;i<prime.size();i++){
		int p=prime[i];
		for(int j=p;j<=n;j+=p){
			A[j]*=p-1;
			B[j]*=p;
		}
	}
	for(int i=1;i<=n;i++) f[i]=i/B[i]*A[i];
	for(int i=1;i<=n;i++) f[i]+=f[i-1];
	for(int i=0;i<prime.size();i++) ans+=(f[n/prime[i]]-1)*2+1;
	printf("%lld",ans);
	return 0;
}

昨天写的,今天发帖

2022/10/24 21:28
加载中...