[BZOJ2671] Calc和与积 - 容斥原理,莫比乌斯反演定理

本蒟蒻的题解

#include"bits/stdc++.h"
using namespace std;
typedef long long ll;
#define regi register int
const int N=50005;int pri[N],cnt,mu[N],n;bool f[N];
void Linear_Shaker(){
	f[1]=true;mu[1]=1;
	for(regi i=2;i<=N-5;i++){
		if(!f[i])pri[++cnt]=i,mu[i]=-1;
		for(regi j=1;j<=cnt&&i*pri[j]<=N;j++){
			f[i*pri[j]]=1,mu[i*pri[j]]=-mu[i];
			if(i%pri[j]==0){mu[i*pri[j]]=0;break;}
		}
	}
}
int di[N<<1],di2[N<<1],top,top2;
ll Calc(){
	ll res=0;
	for(regi y=1;y<=n/(y+1);y++){
		top=0;
		for(regi i=1;i<=y/i;i++){
			if(i*i==y)di[++top]=i;
			else if(y%i==0){
				di[++top]=i;
				di2[++top2]=y/i;
			}
		}
		while(top2)di[++top]=di2[top2--];
		int last=0;
		for(regi x=1;x>n;
	cout<


你可能感兴趣的:(数学,-,数论)