[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_{d|x} 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})\)

代码

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<map>
  5. #define maxn 2000000
  6. #define mod 1000000007
  7. using namespace std;
  8. typedef long long ll;
  9. int n,k;
  10. ll A,B;
  11. int cnt;
  12. bool vis[maxn+5];
  13. int prime[maxn+5];
  14. int mu[maxn+5];
  15. ll s_mu[maxn+5];
  16. void sieve(int n){
  17. mu[1]=1;
  18. for(int i=2;i<=n;i++){
  19. if(!vis[i]){
  20. prime[++cnt]=i;
  21. mu[i]=-1;
  22. }
  23. for(int j=1;j<=cnt&&i*prime[j]<=n;j++){
  24. vis[i*prime[j]]=1;
  25. if(i%prime[j]==0){
  26. mu[i*prime[j]]=0;
  27. break;
  28. }else mu[i*prime[j]]=-mu[i];
  29. }
  30. }
  31. for(int i=1;i<=n;i++) s_mu[i]=(s_mu[i-1]+mu[i])%mod;
  32. }
  33. map<ll,ll>sum_mu;
  34. ll dujiao_sieve(ll x){
  35. if(x<=maxn) return s_mu[x];
  36. if(sum_mu.count(x)) return sum_mu[x];
  37. ll ans=1;
  38. for(ll l=2,r;l<=x;l=r+1){
  39. r=x/(x/l);
  40. ans-=(r-l+1)*dujiao_sieve(x/l)%mod;
  41. ans=(ans+mod)%mod;
  42. }
  43. sum_mu[x]=ans;
  44. return ans;
  45. }
  46. inline ll fast_pow(ll x,ll k){
  47. ll ans=1;
  48. while(k){
  49. if(k&1) ans=ans*x%mod;
  50. x=x*x%mod;
  51. k>>=1;
  52. }
  53. return ans;
  54. }
  55. int main(){
  56. sieve(maxn);
  57. scanf("%d %d %lld %lld",&n,&k,&A,&B);
  58. A=(A-1)/k;
  59. B/=k;
  60. ll ans=0;
  61. for(ll l=1,r;l<=B;l=r+1){
  62. if(A/l) r=min(A/(A/l),B/(B/l));
  63. else r=B/(B/l);
  64. // printf("%d %d\n",l,r);
  65. ans+=fast_pow(B/l-A/l,n)*(dujiao_sieve(r)-dujiao_sieve(l-1)+mod)%mod;
  66. ans%=mod;
  67. }
  68. printf("%lld\n",ans);
  69. }

[BZOJ 3930] [CQOI 2015]选数(莫比乌斯反演+杜教筛)的更多相关文章

  1. 【bzoj3930】[CQOI2015]选数 莫比乌斯反演+杜教筛

    题目描述 我们知道,从区间[L,H](L和H为整数)中选取N个整数,总共有(H-L+1)^N种方案.小z很好奇这样选出的数的最大公约数的规律,他决定对每种方案选出的N个整数都求一次最大公约数,以便进一 ...

  2. BZOJ 3930: [CQOI2015]选数 莫比乌斯反演 + 杜教筛

    求 $\sum_{i=L}^{R}\sum_{i'=L}^{R}....[gcd_{i=1}^{n}(i)==k]$   $\Rightarrow \sum_{i=\frac{L}{k}}^{\fra ...

  3. luogu3172 [CQOI2015]选数 莫比乌斯反演+杜教筛

    link 题目大意:有N个数,每个数都在区间[L,H]之间,请求出所有数的gcd恰好为K的方案数 推式子 首先可以把[L,H]之间的数字gcd恰好为K转化为[(L-1)/K+1,H/K]之间数字gcd ...

  4. BZOJ 3930 Luogu P3172 选数 (莫比乌斯反演)

    手动博客搬家:本文发表于20180310 11:46:11, 原地址https://blog.csdn.net/suncongbo/article/details/79506484 题目链接: (Lu ...

  5. bzoj 4176: Lucas的数论【莫比乌斯反演+杜教筛】

    首先由这样一个结论: \[ d(ij)=\sum_{p|i}\sum_{q|j}[gcd(p,q)==1] \] 然后推反演公式: \[ \sum_{i=1}^{n}\sum_{j=1}^{n}\su ...

  6. [复习]莫比乌斯反演,杜教筛,min_25筛

    [复习]莫比乌斯反演,杜教筛,min_25筛 莫比乌斯反演 做题的时候的常用形式: \[\begin{aligned}g(n)&=\sum_{n|d}f(d)\\f(n)&=\sum_ ...

  7. P4450-双亲数,P5221-Product,P6055-[RC-02]GCD【莫比乌斯反演,杜教筛】

    除了最后一题都比较简单就写一起了 P4450-双亲数 题目链接:https://www.luogu.com.cn/problem/P4450 题目大意 给出\(A,B,d\)求有多少对\((a,b)\ ...

  8. 51nod 1237 最大公约数之和 V3【欧拉函数||莫比乌斯反演+杜教筛】

    用mu写lcm那道卡常卡成狗(然而最后也没卡过去,于是写一下gcd冷静一下 首先推一下式子 \[ \sum_{i=1}^{n}\sum_{j=1}^{n}gcd(i,j) \] \[ \sum_{i= ...

  9. 【bzoj4176】Lucas的数论 莫比乌斯反演+杜教筛

    Description 去年的Lucas非常喜欢数论题,但是一年以后的Lucas却不那么喜欢了. 在整理以前的试题时,发现了这样一道题目"求Sigma(f(i)),其中1<=i< ...

随机推荐

  1. try-catch-finally try中有rerun 是否执行finally

    finally块的语句在try或catch中的return语句执行之后返回之前执行且finally里的修改语句可能影响也可能不影响try或catch中 return已经确定的返回值,若finally里 ...

  2. vue学习-day05 -- 案例:名字合并(监听data数据的改变)

    1.案例:名字合并(监听data数据的改变) 使用keyup事件监听data数据的改变 <!DOCTYPE html> <html> <head> <titl ...

  3. PHP基础教程 php 网络上关于设计模式一些总结

    1.单例模式 单例模式顾名思义,就是只有一个实例.作为对象的创建模式,单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例. 单例模式的要点有三个: 一是某个类只能有一个实例; 二 ...

  4. selenium,控制滚动条

    今天写selenium用例的时候,遇见奇葩的问题,FF下是没有错误的,但是在chrome和ie下就会有问题,后来发现是 操作中点击一个按钮,在页面不可见,就会导致异常,解决方法如下: element ...

  5. DVWA--XSS(反射型)

    0X01爱之初介绍 虽然XSS已经做了两节了 但是还是还是简单解释一下 前言:跨站脚本(Cross-Site Scripting,XSS)是一种经常出现在Web应用程序中的计算机安全漏洞,是由于Web ...

  6. 交互式数据可视化-D3.js(二)选择集和数据

    选择集 select和selectAll类似jquery: d3.select('body') d3.select('.body') d3.select('#body') d3.selectAll(' ...

  7. MongoDB通过JavaDriver执行shell命令,例如创建sharding collection

    Mongodb的java driver本身的接口 void createCollection(String collectionName, CreateCollectionOptions create ...

  8. hg(Mercurial)使用参考

    hg(Mercurial)使用参考   使用hg(mercurial)有好几个月了,个人感觉这款分布式的版本控制系统非常不错,易学,易用:你可以从做在你旁边的同事拉取完整的代码; 对网络的依赖性更低, ...

  9. word中打字会覆盖下一个字

    insert键 误按了insert键,此时Word默认为改写模式,输入文本会覆盖后面的内容.

  10. 一:flask-第一个flask程序

    安装flask:pip install flask,或者pycharm安装 最小模型 访问 后台: