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

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

题目链接:
(Luogu)https://www.luogu.org/problemnew/show/P3172
(BZOJ)http://www.lydsy.com/JudgeOnline/problem.php?id=3930

题目大意:
给定N,M,L,R,从区间[L,R]内选出N个整数使得它们的gcd恰好为m,求合法的选数方案数对1e9+7取模的值。1<=N,M,L,R<=1e9, R-L<=1e5.

思路分析:
gcd? 那就莫比乌斯反演好了。
令F(m)表示从[L,R]中选出N个数,其gcd为m的倍数的方案数。
f(m)表示从[L,R]中选出N个数,其gcd 恰好为m方案数。(莫比乌斯反演常见做法)
我们要求的是f(m),为了简化运算,我们令l等于大于等于L的最小的m的倍数,r等于小于等于L的最大的m的倍数。然后l/=m,r/=m,问题转化为求f(1). (莫比乌斯反演常见做法)
根据莫比乌斯反演公式\[F(n)=\sum_{n|d} f(d), f(n)=\sum_{n|d}\mu (\frac{d}{n})F(d)\], F(n)可以O(1)求得,直接反演即可。
现在面临两个问题:

  1. F(x)和f(x)的定义域是什么?
  2. 如何O(1)求F(x)?

先来解决第二个问题:
F(x)其实就是[l,r]内是x的倍数的数的个数的N次方,可以用快速幂求得。具体见代码getF函数。

难点在于第一个问题:
首先我们知道,定义域不超过r. 而r=R/M是1e9级别的,因此必须优化,发现更多的性质。
F(x)既然表示选出N个数gcd为x的方案数,那我们观察以下式子\[\gcd (x,y)\le y-x (x<y)\]如果选的数不全相等,那它们的gcd一定不会超过r-l, 也就是F(x)和f(x)的定义域就会缩小到r-l, 而r-l是1e5级别的!这就很美妙了!
现在只要处理一下选出的所有数全相等的情况了。
为了缩小定义域,我们给F(x)和f(x)分别添加一个条件: F(x)表示表示从[L,R]中选出不全相等的 N个数,其gcd为x的倍数的方案数,f(x)表示表示从[L,R]中选出不全相等的 N个数,其gcd 恰好为x的方案数,枚举定义域[1,r-l]莫比乌斯反演求出f(1)即可。
而定义变了以后,O(1)计算F(x)的方法也出现了变动: \[F(x)=a^N-a\]其中a为[l,r]内是x的倍数的数的个数。公式解释: 如果是随意选,共有\(a^N\)种选法,然后去掉全部相等的选法,选N个全部相等的数就相当于只选一个数,因此有a种选法,从\(a^N\)中扣除。
以上是计算f(1)的方法。
f(1)算完后,还要加上从[l,r]中选N个全相等的数使得gcd为1的方案数。那显然唯一方案就是全选1,如果1被包含在区间[l,r]中答案就是f(1)+1,否则答案为f(1).

代码实现:

#include<cstdio>
using namespace std;const int N = 1e5+1;
const long long P = 1e9+7;
long long n,m,lb,rb;
int mu[N+4];
long long p[N+4];
bool f[N+4];
int pn;void Mobius()
{mu[1] = 1; pn = 0;for(int i=2; i<=N; i++){if(!f[i]) {pn++; p[pn] = i; mu[i] = -1;}for(int j=1; j<=pn && i*p[j]<=N; j++){f[p[j]*i] = true;if(i%p[j]==0) {mu[i*p[j]] = 0; break;}else mu[i*p[j]] = -mu[i];}}
}long long quickpow(long long a,long long b)
{a %= P;long long cur = a,ret = 1ll;for(int i=0; b; i++){if(b&(1ll<<i)) {ret *= cur; ret %= P; b-=(1ll<<i);}cur *= cur; cur %= P;}return ret;
}long long getF(long long a)
{long long lt,rt;if(lb%a>0ll) lt = lb/a+1;else lt = lb/a;rt = rb/a;return (quickpow(rt-lt+1,n)-(rt-lt+1)+P)%P;
}int main()
{Mobius();scanf("%lld%lld%lld%lld",&n,&m,&lb,&rb);if(lb%m>0ll) lb = lb/m+1;else lb = lb/m;rb/=m;long long nn = rb-lb,ans = 0ll;for(int i=1; i<=nn; i++){ans += mu[i]*getF(i);ans = (ans+P)%P;}if(lb<=1 && 1<=rb) {ans++; ans%=P;}printf("%lld\n",ans);return 0;
}

发表于 2019-01-02 13:38 suncongbo 阅读(...) 评论(...) 编辑 收藏

刷新评论刷新页面返回顶部

BZOJ 3930 Luogu P3172 选数 (莫比乌斯反演)相关推荐

  1. 【BZOJ3930】[CQOI2015]选数 莫比乌斯反演

    [BZOJ3930][CQOI2015]选数 Description 我们知道,从区间[L,H](L和H为整数)中选取N个整数,总共有(H-L+1)^N种方案.小z很好奇这样选出的数的最大公约数的规律 ...

  2. BZOJ 2734 [HNOI2012]集合选数 (状压DP、时间复杂度分析)

    题目链接 https://www.lydsy.com/JudgeOnline/problem.php?id=2734 题解 嗯早就想写的题,昨天因为某些不可告人的原因(大雾)把这题写了,今天再来写题解 ...

  3. bzoj 2820: YY的GCD(莫比乌斯反演)

    2820: YY的GCD Time Limit: 10 Sec  Memory Limit: 512 MB Submit: 2111  Solved: 1137 [Submit][Status][Di ...

  4. BZOJ 2154 Crash的数字表格 (莫比乌斯反演)

    Crash的数字表格 今天的数学课上,Crash小朋友学习了最小公倍数(Least Common Multiple).对于两个正整数a和b,LCM(a, b)表示能同时被a和b整除的最小正整数.例如, ...

  5. BZOJ 2820 YY的GCD(莫比乌斯反演)

    Description 神犇YY虐完数论后给傻×kAc出了一题给定N, M,求1<=x<=N, 1<=y<=M且gcd(x, y)为质数的(x, y)有多少对,kAc这种傻×必 ...

  6. BZOJ 3994: [SDOI2015]约数个数和 [莫比乌斯反演 转化]

    2015 题意:\(d(i)\)为i的约数个数,求\(\sum\limits_{i=1}^n \sum\limits_{j=1}^m d(ij)\) \(ij\)都爆int了.... 一开始想容斥一下 ...

  7. BZOJ 3994 [SDOI2015]约数个数和 (莫比乌斯反演)

    题目大意:略 洛谷传送门 首先要知道这样一个公式不知道这个公式这道题还怎么做... $d(ij)=\sum\limits_{x=1}^{i} \sum\limits_{y=1}^{j}[gcd(x,y ...

  8. BZOJ 4816[SDOI2017]数字表格(莫比乌斯反演)

    题目链接 \(Description\) 用\(f_i\)表示\(fibonacci\)数列第\(i\)项,求\(\prod_{i=1}^{n}\prod_{j=1}^{m}f[gcd(i,j)]\) ...

  9. BZOJ 1101 Luogu P3455 POI 2007 Zap (莫比乌斯反演+数论分块)

    BZOJ 1101 Luogu P3455 POI 2007 Zap (莫比乌斯反演+数论分块) 手动博客搬家: 本文发表于20171216 13:34:20, 原地址https://blog.csd ...

最新文章

  1. LigerUI——天外飞仙
  2. Kotlin-Learning 扩展
  3. 阿里云可以外链mysql_案例详细说明阿里云下设置MySQL远程连接步骤
  4. SpringMVC自定义拦截器与异常处理(自定义异常)
  5. 成功的秘诀是什么_学习编码的10个成功秘诀
  6. html5获取gps坐标,html5获取手机GPS信息的示例代码
  7. Python邻接矩阵邻接表转换
  8. Git报错:The file will have its original line endings in your working directory
  9. pytorch---之pin_memory
  10. 5.3 tensorflow2实现梯度下降法完成广告投入销售额预测——python实战
  11. 安卓实现调用三方地图导航
  12. 3D检测入门知识梳理
  13. 解决Mysql计算时除数为0
  14. vue 键盘(上下左右)快捷键
  15. matlab绘制香农定理曲线,基于matla对香农公式仿真.doc
  16. 你以为链家只是一个中介,但其实……
  17. steam无法连接至计算机,大神传授win7系统游戏无法连接至steam网络一直卡在“正在连接steam”界面的设置技巧...
  18. Terraria泰拉瑞亚服务器搭建
  19. redis c++接口
  20. Redis6.0以后版本安装报错问题

热门文章

  1. python中用turtle绘制时钟_python使用turtle库绘制时钟
  2. 信号分解:双正交、完备性、对偶向量
  3. 简单的串口助手程序开发
  4. Linux下的编程入门
  5. 在代码中使用SqlCommand对象
  6. TCP协议抓包分析 -- wireshark
  7. 【CyberSecurityLearning 64】SSRF
  8. BUUCTF-WEB:[极客大挑战 2019]LoveSQL 1
  9. eventproxy
  10. 【快乐水题】575. 分糖果