BZOJ5323 [Jxoi2018]游戏 【数论/数学】
2018-05-24 12:28
288 查看
题目链接
题解
有一些数是不能被别的数筛掉的
这些数出现最晚的位置就是该排列的\(t(p)\)
所以我们只需找出所有这些数,线性筛一下即可,设有\(m\)个
然后枚举最后的位置
\[ans = \sum\limits_{i = m}^{n} m!(n - m)!{i - 1 \choose m - 1}i\]
复杂度\(O(n)\)
#include<iostream> #include<cstdio> using namespace std; const int maxn = 10000005,P = 1000000007; int p[maxn],isn[maxn],pi,L,R,len; int fac[maxn],fv[maxn],inv[maxn]; void pre(){ fac[0] = fac[1] = inv[0] = inv[1] = fv[0] = fv[1] = 1; for (register int i = 2; i <= len; i++){ fac[i] = 1ll * fac[i - 1] * i % P; inv[i] = 1ll * (P - P / i) * inv[P % i] % P; fv[i] = 1ll * fv[i - 1] * inv[i] % P; } } void init(){ for (register int i = 2; i <= R; i++){ if (!isn[i]) p[++pi] = i; for (register int j = 1; j <= pi && i * p[j] <= R; j++){ isn[i * p[j]] = p[j]; if (i % p[j] == 0) break; } } } int main(){ scanf("%d%d",&L,&R); len = R - L + 1; pre(); int cnt = 0; if (L == 1) cnt = 1; else{ init(); for (register int i = L; i <= R; i++){ if (!isn[i] || i / isn[i] < L) cnt++; } } int ans = 0; for (register int i = cnt; i <= len; i++){ ans = (ans + 1ll * fac[i - 1] % P * fv[i - cnt] % P * i % P) % P; } ans = 1ll * ans * cnt % P * fac[len - cnt] % P; printf("%d\n",ans); return 0; }
相关文章推荐
- bzoj 5323: [Jxoi2018]游戏
- BZOJ5323 & 洛谷4562:[JXOI2018]游戏——题解
- BZOJ.5329.[SDOI2018]战略游戏(圆方树 虚树)
- [BZOJbegin][NOIP十连测第七场]约瑟夫游戏(递推|数学相关|递归)
- bzoj1025 [SCOI2009]游戏(数论+背包dp)
- bzoj 5285: [Hnoi2018]寻宝游戏
- bzoj 1025: [SCOI2009]游戏【数学+dp】
- Bzoj 4403: 序列统计 Lucas定理,组合数学,数论
- bzoj 1978: [BeiJing2010]取数游戏 game 数学
- [BZOJ1025][SCOI2009]游戏(置换+背包dp+数学相关)
- 数学(数论)BZOJ 3309:DZY Loves Math
- [数论 CRT] BZOJ 2976 [Poi2002]出圈游戏
- bzoj 5329: [Sdoi2018]战略游戏
- bzoj5193 [Usaco2018 Feb]Cow Gymnasts(数学)
- #bzoj3391#小球游戏(数论 + 网格路径模型)
- [BZOJ5288][HNOI2018]游戏(拓扑排序)
- bzoj 4173: 数学 (数论+sqrt求phi)
- 【BZOJ 4173】 数学 数论
- BZOJ5324 & 洛谷4563 & LOJ2545:[JXOI2018]守卫——题解
- bzoj5187 [Usaco2018 Jan]Sprinklers(数学+计数+前缀和)