[bzoj4916] 神犇和蒟蒻 [杜教筛]
2018-03-08 19:38
381 查看
题面:
传送门
一句话,就是让你求$\mu\left(i^2\right)$以及$\varphi\left(i^2\right)$的前缀和
思路:
第一问,瞪了一会儿恍然大悟:这不就是1吗......
因为对于$\mu\left(i^2\right)$,$i^2=i\ast i$,那么$\mu\left(i^2\right)$在$i\neq1$的时候值都是0
所以第一问输出1就好了......
接下来看第二问
这一问中解决$\varphi\left(i^2\right)$是关键,因为这东西是个积性函数,可以套进杜教筛里面,而一旦进了杜教筛这题就解决了
当前的关键,是找到杜教筛套路式子中的$g\left(x\right)
我当时想了半天,准备从$\varphi$函数的本质下手,奈何能力不足,就参考了一下某度上的结果,然后看到了这个东西:
![](https://images2018.cnblogs.com/blog/1226867/201803/1226867-20180308193139495-480455107.jpg)
发现,当$n$变成$n^2$的时候,右边的每一个质数$p$的指数都上升了$a_p$
也就是说,$\varphi\left(i^2\right)=\varphi\left(i\right)\ast i$
美!滋!滋!
所以我们只要设$g\left(x\right)=x$,然后套用杜教筛套路:
$ g\left(1\right)S\left(n\right)=\sum_{i=1}^{n}\left(g\ast f\right)\left(i\right)-\sum_{i=2}^{n}g\left(i\right)S\left(\frac ni\right) $
此时g和f函数的卷积等于id
$ S\left(n\right)=\sum_{i=1}^{n}i-\sum{i=2}^{n}iS\left(\frac ni\right) $
然后就递归记忆化AC
Code:
传送门
一句话,就是让你求$\mu\left(i^2\right)$以及$\varphi\left(i^2\right)$的前缀和
思路:
第一问,瞪了一会儿恍然大悟:这不就是1吗......
因为对于$\mu\left(i^2\right)$,$i^2=i\ast i$,那么$\mu\left(i^2\right)$在$i\neq1$的时候值都是0
所以第一问输出1就好了......
接下来看第二问
这一问中解决$\varphi\left(i^2\right)$是关键,因为这东西是个积性函数,可以套进杜教筛里面,而一旦进了杜教筛这题就解决了
当前的关键,是找到杜教筛套路式子中的$g\left(x\right)
我当时想了半天,准备从$\varphi$函数的本质下手,奈何能力不足,就参考了一下某度上的结果,然后看到了这个东西:
![](https://images2018.cnblogs.com/blog/1226867/201803/1226867-20180308193139495-480455107.jpg)
发现,当$n$变成$n^2$的时候,右边的每一个质数$p$的指数都上升了$a_p$
也就是说,$\varphi\left(i^2\right)=\varphi\left(i\right)\ast i$
美!滋!滋!
所以我们只要设$g\left(x\right)=x$,然后套用杜教筛套路:
$ g\left(1\right)S\left(n\right)=\sum_{i=1}^{n}\left(g\ast f\right)\left(i\right)-\sum_{i=2}^{n}g\left(i\right)S\left(\frac ni\right) $
此时g和f函数的卷积等于id
$ S\left(n\right)=\sum_{i=1}^{n}i-\sum{i=2}^{n}iS\left(\frac ni\right) $
然后就递归记忆化AC
Code:
#include<iostream> #include<cstring> #include<algorithm> #include<cstdio> #include<map> #define ll long long ll MOD=1e9+7,inv6=166666668; using namespace std; inline ll read(){ ll re=0,flag=1;char ch=getchar(); while(ch>'9'||ch<'0'){ if(ch=='-') flag=-1; ch=getchar(); } while(ch>='0'&&ch<='9') re=(re<<1)+(re<<3)+ch-'0',ch=getchar(); return re*flag; } ll tot,pri[2000010],phi[2000010];bool vis[2000010]={0}; void init(){ ll i,j,k;phi[1]=1;vis[1]=1; for(i=2;i<=2000000;i++){ if(!vis[i]){ pri[++tot]=i;phi[i]=i-1; } for(j=1;j<=tot;j++){ k=i*pri[j];if(k>2000000) break; vis[k]=1; if(i%pri[j]==0){ phi[k]=phi[i]*pri[j]%MOD; break; } phi[k]=phi[i]*phi[pri[j]]%MOD; } } for(i=1;i<=2000000;i++) phi[i]=(i*phi[i]%MOD+phi[i-1])%MOD; } map<ll,ll>m; ll sum(ll l,ll r){return (r-l+1)*(r+l)/2%MOD%MOD;} ll sum2(ll x){x%=MOD;return x*(x+1)%MOD*(2*x+1)%MOD*inv6%MOD;} ll S(ll x){ if(x<=2000000) return phi[x]; if(m[x]) return m[x]; ll i,j,re=sum2(x); for(i=2;i<=x;i=j+1){ j=x/(x/i); re-=sum(i,j)*S(x/i)%MOD;re%=MOD; } return m[x]=(re+MOD)%MOD; } int main(){ ll i,j,n;init(); n=read();puts("1"); printf("%lld\n",S(n)); }
相关文章推荐
- 【BZOJ4916】神犇和蒟蒻(杜教筛)
- 【BZOJ4916】神犇和蒟蒻(杜教筛)
- [杜教筛 莫比乌斯反演][BZOJ]4916: 神犇和蒟蒻(我)
- bzoj 4916: 神犇和蒟蒻 杜教筛
- 【杜教筛】BZOJ4916[神犇(JZ)和蒟蒻(ZZK)]题解
- [杜教筛] BZOJ 4916 神犇和蒟蒻
- BZOJ 4916: 神犇和蒟蒻 杜教筛 数学
- 【BZOJ4916】神犇和蒟蒻 杜教筛
- BZOJ4916 神犇和蒟蒻 【欧拉函数 + 杜教筛】
- BZOJ 4916 神犇和蒟蒻
- bzoj 4916 神犇和蒟蒻
- [bzoj4916]神犇和蒟蒻
- [bzoj4916]神犇和蒟蒻
- BZOJ 4916 神犇和蒟蒻(杜教筛)
- [BZOJ4916]神犇和蒟蒻
- bzoj4916 神犇和蒟蒻
- bzoj 4916: 神犇和蒟蒻【欧拉函数+莫比乌斯函数+杜教筛】
- [BZOJ 4916]神犇和蒟蒻
- bzoj 4916: 神犇和蒟蒻 (杜教筛+莫比乌斯反演)
- bzoj 4916: 神犇和蒟蒻