[JXOI2018]游戏
发布日期:2021-08-17 17:17:09 浏览次数:4 分类:技术文章

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

九条可怜竟然有这种良心题,似乎稍稍刷新了我对九条可怜的认识。
首先假设我们求出了所有必须要筛出来的数m,那么\(t(p)\)就只受最后一个数的位置影响。
所以我们枚举最后一个数的位置,然后用组合数搞一下就完事了。
\(dp[i]\)表示最后一个数在位置\(i\)时,\(t(p)\)的和,则
\[dp[i] = m * A_{i - 1} ^ {m - 1} * (n - m)!\]
然后答案就是\(\sum _ {i = 1} ^ {n} dp[i]\)
至于如何求\(m\),刚开始我以为是\([l, r]\)中的所有质数的个数,但想一想就会发现不对劲,比如\(l = 4, r = 10\),虽然4不是质数,但却必须选。
所以我一直在想用\(O(n)\)的方法筛出这些数。
但是怎么也想不出来。
最后无奈的写了个欧拉筛。
竟然过了。
看了题解才知道,欧拉筛复杂度是\(O(nloglogn)\)的,我记成了\(O(nlogn)\),而且常数小所以能跑过去,什么道理……

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;#define enter puts("") #define space putchar(' ')#define Mem(a, x) memset(a, x, sizeof(a))#define In inlinetypedef long long ll;typedef double db;const int INF = 0x3f3f3f3f;const db eps = 1e-8;const int maxn = 1e7 + 5;const ll mod = 1e9 + 7;inline ll read(){ ll ans = 0; char ch = getchar(), last = ' '; while(!isdigit(ch)) last = ch, ch = getchar(); while(isdigit(ch)) ans = (ans << 1) + (ans << 3) + ch - '0', ch = getchar(); if(last == '-') ans = -ans; return ans;}inline void write(ll x){ if(x < 0) x = -x, putchar('-'); if(x >= 10) write(x / 10); putchar(x % 10 + '0');}int l, r, n, cnt = 0;ll fac[maxn], inv[maxn];In ll quickpow(ll a, ll b){ ll ret = 1; for(; b; b >>= 1, a = a * a % mod) if(b & 1) ret = ret * a % mod; return ret;}In ll A(int n, int m) {return fac[n] * inv[n - m] % mod;}In ll inc(ll a, ll b) {return a + b >= mod ? a + b - mod : a + b;}bool vis[maxn];In void init(){ fac[0] = inv[0] = 1; for(int i = 1; i < maxn; ++i) fac[i] = fac[i - 1] * i % mod; inv[maxn - 1] = quickpow(fac[maxn - 1], mod - 2); for(int i = maxn - 2; i; --i) inv[i] = inv[i + 1] * (i + 1) % mod; for(int i = l; i <= r; ++i) if(!vis[i]) { ++cnt; for(int j = i; j <= r; j += i) vis[j] = 1; }}int main(){ l = read(), r = read(); n = r - l + 1; init(); ll ans = fac[cnt] * fac[n - cnt] % mod * cnt % mod; for(int i = cnt + 1; i <= n; ++i) ans = inc(ans, A(i - 1, cnt - 1) * cnt % mod * fac[n - cnt] % mod * i % mod); write(ans), enter; return 0;}

转载于:https://www.cnblogs.com/mrclr/p/10563845.html

转载地址:https://blog.csdn.net/weixin_30856725/article/details/98799365 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:进程内部的同步
下一篇:BZOJ4066 简单题

发表评论

最新留言

关注你微信了!
[***.104.42.241]2024年04月12日 15时14分32秒