标签:一点 http i++ details turn amp detail ++ name
积性函数前n项和必看好文
https://blog.csdn.net/skywalkert/article/details/50500009
递归计算的时候要用map记忆化一下,前面的打表会比较快一点。
AC代码
#include<bits/stdc++.h> using namespace std; const int maxn=1e6+10; typedef long long ll; map<ll,ll> ma; int check[maxn],prime[maxn],mu[maxn]; void Mobius(int N)//莫比乌斯函数线性筛 { int pos=0;mu[1]=1; for (int i = 2 ; i <= N ; i++) { if (!check[i]) prime[pos++] = i,mu[i]=-1; for (int j = 0 ; j < pos && i*prime[j] <= N ; j++) { check[i*prime[j]] = 1; if (i % prime[j] == 0) { mu[i*prime[j]]=0; break; } mu[i*prime[j]]=-mu[i]; } } for(int i=2;i<=N;i++) mu[i]+=mu[i-1]; } ll solve(ll a) { if(a<=1e6) //记忆化 return mu[a]; if(ma.count(a)) return ma[a]; ll temp=1; for(ll i=2;i<=a;) { ll t=a/i; ll k=a/t; temp-=(k-i+1)*solve(t);//分段或者叫分块加速一下 i=k+1; } return ma[a]=temp; } int main() { Mobius(1e6); ll a,b; cin>>a>>b; cout<<solve(b)-solve(a-1)<<endl; }
标签:一点 http i++ details turn amp detail ++ name
原文地址:https://www.cnblogs.com/stranger-/p/9657135.html