这题直接莫比乌斯反演不用欧拉函数能做吗

P1447 [NOI2010] 能量采集

@[Gax_c](/space/show?uid=13494) %%%
by Jeanne_Alter @ 2018-12-09 19:03:35


@[HermioneGranger](/space/show?uid=95405) 大佬求教
by Gax_c @ 2018-12-09 19:10:55


@[Gax_c](/space/show?uid=13494) %%%,反演dalao
by yzhang @ 2018-12-09 19:14:41


``` #include<bits/stdc++.h> using namespace std; int mu[100004],tot,T,p[100004],vis[100004],sum[100004],n,m; inline void init(){ int nx=100000;mu[1]=1; for (register int i=2;i<=nx;i++){ if (!vis[i]) p[++tot]=i,mu[i]=-1; for (register int j=1;j<=tot&&i*p[j]<=nx;j++){ if (i*p[j]>nx) continue; vis[i*p[j]]=1; if((i%p[j])==0){ mu[i*p[j]]=0; break; } mu[i*p[j]]=-mu[i]; } } for (register int i=1;i<=nx;i++){ sum[i]=sum[i-1]+mu[i]; } } inline long long Fun(int a,int b,int d){ long long ans=0; for (int l=1,r;l<=min(a,b);l=r+1){ r=min(a/(a/l),b/(b/l)); ans+=(long long)(sum[r]-sum[l-1])*(a/(l*d))*(b/(l*d)); } return ans; } int main(){ scanf("%d%d",&n,&m); init(); long long ans=0; for (register int i=1;i<=min(n,m);i++){ ans+=Fun(n,m,i)*i; } cout<<2*ans-n*m; }``` 我一开始直接mofan的,被卡成九十,过不去
by Fading @ 2018-12-09 19:19:51


@[Fading](/space/show?uid=20309) 为什么我会WA啊
by Gax_c @ 2018-12-09 19:23:50


我的莫反AC了?
by command_block @ 2018-12-16 11:45:19


能吧,我的式子推出来没有phi
by 南方不败 @ 2019-04-28 15:40:49


如果式子推出来没有 $\boldsymbol \varphi(n)$ ,那肯定就有 $\displaystyle \sum_{d\mid n} \boldsymbol \mu(d){n\over d}$ 之类的 实际上会发现它是积性函数,就会令 $\displaystyle \boldsymbol f(n)=\sum_{d\mid n}\boldsymbol \mu(d){n\over d}$ 然后推 $\boldsymbol f(n)$ 的线筛公式,接着就会发现其实 $\boldsymbol f=\boldsymbol \varphi$ 。。。。。。 --- 因为其实 $\displaystyle \sum_{d\mid n} \boldsymbol \mu(d){n\over d}=\sum_{d\mid n}\boldsymbol \mu(d)\boldsymbol {id}({n\over d})$ 如果懂得迪利克雷卷积就是 $(\boldsymbol \mu*\boldsymbol {id})(n)$ 而 $\boldsymbol \varphi*\boldsymbol I=\boldsymbol {id}$ 两边同时卷一个 $\boldsymbol \mu$ $\boldsymbol \varphi*\boldsymbol I*\boldsymbol \mu=\boldsymbol {id}*\boldsymbol \mu$ 即 $\boldsymbol {id}*\boldsymbol \mu=\boldsymbol \varphi$
by JustinRochester @ 2019-08-26 12:22:32


|