博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Luogu 3172 [CQOI2015]选数
阅读量:5123 次
发布时间:2019-06-13

本文共 1878 字,大约阅读时间需要 6 分钟。

考虑枚举$k$的倍数$dk$,容易知道$\left \lceil \frac{L}{K} \right \rceil\leq d\leq \left \lfloor \frac{H}{k} \right \rfloor$

我们设全部$n$个数含有公因子$dk$且全部数互不相同的方案数是$f(d)$,记$x = (\left \lceil \frac{L}{K} \right \rceil - \left \lfloor \frac{H}{k} \right \rfloor + 1)$

    那么$f(d) = (x^{n} - x)$

但是这样不是完全对的,因为这样子相当于把最大公因数是$2k,3k...$的情况也考虑进去了,我们最后还要容斥掉$f(2) f(3)...$这些数

其实就是一个莫比乌斯函数啦……线性筛一波

答案$ans = \sum_{i = 1}^{x - 1}f_{i} * \mu _{i}$

最后注意当$\left \lceil \frac{L}{K} \right \rceil$为$1$的时候,全部都选1也是一种可行的方案。

时间复杂度$O(nlogn)$

Code:

#include 
using namespace std;typedef long long ll;const int N = 1e5 + 5;const ll P = 1e9 + 7;int n, ln, rn, k, pCnt = 0, pri[N];ll mu[N], f[N];bool np[N];inline ll pow(ll x, ll y) { ll res = 1; for(; y > 0; y >>= 1) { if(y & 1) res = res * x % P; x = x * x % P; } return res;}inline void sieve() { mu[1] = 1LL; for(int i = 2; i <= rn - ln; i++) { if(!np[i]) { mu[i] = -1LL; pri[++pCnt] = i; } for(int j = 1; j <= pCnt && pri[j] * i <= rn - ln; j++) { np[i * pri[j]] = 1; if(i % pri[j] == 0) break; else mu[i * pri[j]] = -mu[i]; } } }int main() { scanf("%d%d%d%d", &n, &k, &ln, &rn); /* if(ln % k) ln = ln / k + 1; else ln /= k; */ ln = (ln + k - 1) / k, rn /= k; if(ln > rn) return puts("0"), 0; sieve(); for(int i = 1; i <= rn - ln; i++) { int l = ln, r = rn;/* if(l % i) l = l / i + 1; else l /= i; */ l = (l + i - 1) / i, r /= i; if(l > r) continue; f[i] = (pow(r - l + 1, n) - (r - l + 1) + P) % P; } ll ans = 0; for(int i = 1; i <= rn - ln; i++) ans = (ans + f[i] * mu[i] % P + P) % P; if(ln == 1) ans = (ans + 1LL) % P; printf("%lld\n", ans); return 0;}
View Code

 

转载于:https://www.cnblogs.com/CzxingcHen/p/9481710.html

你可能感兴趣的文章
Python语言下图像的操作方法总结
查看>>
使用WinDbg分析死锁
查看>>
基于ssm的poi反射bean实例
查看>>
Xcode快捷键大全
查看>>
【SQL】- 基础知识梳理(八) - 事务与锁
查看>>
一个最简的短信验证码倒计时例子
查看>>
Linus 谈软件开发管理经验
查看>>
easyspider
查看>>
php5.6安装Zend Opcache扩展
查看>>
kubernetes 1.6 集群实践 (八)
查看>>
highcharts折线图的简单使用
查看>>
获取Filter的三种途径 分类: DirectX ...
查看>>
POJ-2955括号匹配问题(区间DP)
查看>>
Jquery获取浏览器窗口和Body长宽
查看>>
c++ 引用
查看>>
IT面试技巧终身受益
查看>>
在Nodejs中如何调用C#的代码
查看>>
Java中的数组
查看>>
TortoiseGit免密码配置
查看>>
eclipse里部署struts2
查看>>