bzoj 4916 神犇与蒟蒻 Posted on 2019-05-14 | Views: 杜教筛小水题. 根据 $\mu$ 的定义,第一个式子显然为 $1$ . 根据 $\varphi$ 的定义,第二个式子显然为 $\sum_{i=1}^N i\cdot \varphi(i)$ ,直接杜教筛即可. 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495#include<bits/stdc++.h>using namespace std;typedef long long ll;inline int read(){ int out=0,fh=1; char jp=getchar(); while ((jp>'9'||jp<'0')&&jp!='-') jp=getchar(); if (jp=='-') fh=-1,jp=getchar(); while (jp>='0'&&jp<='9') out=out*10+jp-'0',jp=getchar(); return out*fh;}const int P=1e9+7;inline int add(int a,int b){ return (a + b) % P;}inline int mul(int a,int b){ return 1LL * a * b % P; }int fpow(int a,int b){ int res=1; while(b) { if(b&1) res=mul(res,a); a=mul(a,a); b>>=1; } return res;}int inv2,inv6;inline int sumh(int x){ int s=mul(x,x+1); s=mul(s,2*x+1); s=mul(s,inv6); return s;}inline int sumg(int l,int r){ return mul(mul(l+r,r-l+1),inv2);}const int N=32000,MAXN=N+10;int phi[MAXN],cnt=0,prime[MAXN],ism[MAXN],sum[MAXN];void init(){ phi[1]=1,ism[1]=1; for(int i=2;i<=N;++i) { if(!ism[i]) prime[++cnt]=i,phi[i]=i-1; for(int j=1;j<=cnt && i*prime[j]<=N;++j) { ism[i*prime[j]]=1; if(i%prime[j]==0) { phi[i*prime[j]]=mul(phi[i],prime[j]); break; } phi[i*prime[j]]=mul(phi[i],prime[j]-1); } } for(int i=1;i<=N;++i) sum[i]=add(sum[i-1],mul(i,phi[i]));}map<int,int> mp;int calc(int n){ if(n<=N) return sum[n]; if(mp.find(n)!=mp.end()) return mp[n]; int res=sumh(n); for(int l=2,r;l<=n;l=r+1) { r=n/(n/l); res=add(res,P-mul(sumg(l,r),calc(n/l))); } return mp[n]=res;}int main(){ inv2=fpow(2,P-2); inv6=fpow(6,P-2); init(); int n=read(); printf("%d\n%d\n",1,calc(n)); return 0;}