MLE 杜教筛+莫比乌斯反演 求优化
查看原帖
MLE 杜教筛+莫比乌斯反演 求优化
922691
Kapo_Hisy楼主2024/9/14 19:51
#include<cstdio>
#include<vector>
#include<unordered_map>
#define MAXN 215444
using namespace std;
typedef long long ll;
int mo[MAXN],pre[MAXN];
bool flag[MAXN];
vector<int> prim;
unordered_map<int,int> mp;
inline ll power(ll x,int y){
    ll res=1;
    while(y){
        if(y&1){
            res*=x;
        }
        x*=x;
        y>>=1;
    }
    return res;
}
inline void prework(){
	mo[1]=1;
	for(int i=2;i<MAXN;++i){
		if(!flag[i]){
			mo[i]=-1;
			prim.push_back(i);
		}
		for(int j=0;j<prim.size()&&i*prim[j]<MAXN;++j){
			flag[i*prim[j]]=true;
			if(i%prim[j]){
				mo[i*prim[j]]=-mo[i];
			}else{
				mo[i*prim[j]]=0;
				break;
			}
		}
	}
	for(int i=1;i<MAXN;++i){
		pre[i]=pre[i-1]+mo[i];
	}
}
int mobius(int n){
	if(n<MAXN){
		return pre[n];
	}
	if(mp.count(n)){
		return mp[n];
	}
	int res=1;
	for(int l=1,r=0;l<=n;l=r+1){
		r=n/(n/l);
		res-=(r-l+1)*mobius(n/l);
	}
	return mp[n]=res;
}
int main(){
    prework();
	int n,m;
	scanf("%d %d",&n,&m);
	ll ans=0;
	for(int i=1;i<=m;++i){
		if(m%i==0){
			ans+=(mobius(i)-mobius(i-1))*power(m/i,n);
		}
	}
	printf("%lld",ans);
	return 0;
}
2024/9/14 19:51
加载中...