[BZOJ 3930] [CQOI 2015]选数(莫比乌斯反演+杜教筛)
题面
我们知道,从区间\([L,R]\)(L和R为整数)中选取N个整数,总共有\((R-L+1)^N\)种方案。求最大公约数刚好为K的选取方案有多少个。由于方案数较大,你只需要输出其除以1000000007的余数即可。
\[N,K,L,H \leq 10^9,H-L \leq 10^5\]
分析
\(\because \gcd(ka,kb)=k\gcd(a,b)\),我们先把\(L,R\)除以\(K\),然后问题就变成了求gcd=1的方案数
设\(f(x)\)表示区间[l,r]里选n个数,gcd为x的方案数
设\(F(x)\)表示区间[l,r]里选n个数,gcd被x整除的方案数
\(\because x|\gcd(i,j),\therefore x|i,x|j\)
[l,r]里被x整除的数有\((\lfloor \frac{r}{x} \rfloor-\lfloor \frac{l-1}{x} \rfloor)\)个
因此\(F(x)=(\lfloor \frac{r}{x} \rfloor-\lfloor \frac{l-1}{x} \rfloor)^n\)
\(F,f\)显然满足莫比乌斯反演的第二种形式,\(F(x)=\sum_{x|d} f(d)\)
\(f(x)=\sum_{x|d} F(d) \mu(\frac{d}{x})\)
我们要求的是
\[f(1)=\sum_{1|d} F(d) \mu(d)=\sum_{d=1}^r \mu(d) (\lfloor \frac{r}{d} \rfloor-\lfloor \frac{l-1}{d} \rfloor)^n\]
后面的部分可以数论分块然后快速幂求解,但由于\(r \leq 10^9\),不能直接线性筛\(\mu\)的前缀和,需要用杜教筛。
杜教筛:
套路公式:
我们要求\(f\)的前缀和,构造两个函数\(g,h\)满足\(h=f*g\), \(F,G,H\)为它们的前缀和
\[g(1)F(n)=H(n)-\sum_{d=2}^n g(d) F(\frac{n}{d})\]
如果\(f=\mu\),注意到\(\mu*I=\varepsilon\),那么\(g(n)=I(n)=1,h(n)=\varepsilon(n),H(n)=\varepsilon(1)=1\)
代入得\(F(n)=1-\sum_{d=2}^n F(\frac{n}{d})\)
代码
#include
#include
#include
#include