教科书般的亵渎

题目背景:

5.23 模拟 TJOI2018D2T3

分析:拉格朗日差值

这个题的题意怕不是有毒,注意他每一次的k是相同的,为总共要用多少次卡片,然后卡片是每次先将所有的数减一,如果这一次减一的过程中有一个数变成了0,那么就会把所有数再次减1,直到一次没有数被减为0,或者所有数都为0才算是一次卡片的效果停止,比如样例的第一组数据,用完一次卡片之后原来为1 ~ 4的怪物全部都已经死了,原来为6 ~ 10的会变成1 ~ 5,考虑这道题,显然我们需要求一些ik的前缀和,显然k = m + 1也就是有多少段,而要快速求ik的前缀和,考虑到前缀和一定是一个k + 1次多项式,我们直接用拉格朗日插值,插掉前k + 2项就可以了,然后每一次询问前缀和就是O(m)的,需要询问O(m2)次,所以总复杂度为O(Tm3)。可以轻松通过。

Source:

/*created by scarlyw
*/
#include <cstdio>
#include <string>
#include <algorithm>
#include <cstring>
#include <iostream>
#include <cmath>
#include <cctype>
#include <vector>
#include <set>
#include <queue>
#include <ctime>
#include <deque>
#include <iterator>
#include <map>inline char read() {static const int IN_LEN = 1024 * 1024;static char buf[IN_LEN], *s, *t;if (s == t) {t = (s = buf) + fread(buf, 1, IN_LEN, stdin);if (s == t) return -1;}return *s++;
}/*
template<class T>
inline void R(T &x) {static char c;static bool iosig;for (c = read(), iosig = false; !isdigit(c); c = read()) {if (c == -1) return ;if (c == '-') iosig = true;   }for (x = 0; isdigit(c); c = read()) x = ((x << 2) + x << 1) + (c ^ '0');if (iosig) x = -x;
}
//*/const int OUT_LEN = 1024 * 1024;
char obuf[OUT_LEN], *oh = obuf;
inline void write_char(char c) {if (oh == obuf + OUT_LEN) fwrite(obuf, 1, OUT_LEN, stdout), oh = obuf;*oh++ = c;
}template<class T>
inline void W(T x) {static int buf[30], cnt;if (x == 0) write_char('0');else {if (x < 0) write_char('-'), x = -x;for (cnt = 0; x; x /= 10) buf[++cnt] = x % 10 + 48;while (cnt) write_char(buf[cnt--]);}
}inline void flush() {fwrite(obuf, 1, oh - obuf, stdout);
}// /*
template<class T>
inline void R(T &x) {static char c;static bool iosig;for (c = getchar(), iosig = false; !isdigit(c); c = getchar()) {if (c == -1) return ;if (c == '-') iosig = true; }for (x = 0; isdigit(c); c = getchar()) x = ((x << 2) + x << 1) + (c ^ '0');if (iosig) x = -x;
}
// */const int MAXN = 50 + 10;
const int mod = 1000000000 + 7;#define int long long
long long t, cnt, n, m, k;
long long a[MAXN], fac[MAXN], inv_fac[MAXN], f[MAXN], num[MAXN];inline long long mod_pow(long long a, long long b) {long long ans = 1;for (; b; b >>= 1, a = a * a % mod)if (b & 1) ans = ans * a % mod;return ans;
}inline void solve_number(int k) {for (int i = 1; i <= k + 1; ++i) {num[i] = f[i] * inv_fac[i - 1] % mod * inv_fac[k + 1 - i] % mod;num[i] = (((k + 1 - i) & 1) ? mod - num[i] : num[i]);}
}inline long long sum(long long n) {static long long front[MAXN], behind[MAXN];n %= mod, front[0] = 1, behind[k + 3] = 1;for (int i = 1; i <= k + 2; ++i) front[i] = front[i - 1] * (n - i + mod) % mod;for (int i = k + 2; i >= 2; --i)behind[i] = behind[i + 1] * (n - i + mod) % mod;long long ans = 0;for (int i = 1; i <= k + 2; ++i) ans = (ans + front[i - 1] * behind[i + 1] % mod * num[i]) % mod;return ans;
}inline void solve() {R(n), R(m);for (int i = 1; i <= m; ++i) R(a[i]);std::sort(a + 1, a + m + 1), a[m + 1] = n + 1, k = m + 1, fac[0] = 1;for (int i = 1; i <= k + 2; ++i) f[i] = (f[i - 1] + mod_pow(i, k)) % mod;for (int i = 1; i <= k + 2; ++i) fac[i] = fac[i - 1] * i % mod;inv_fac[k + 2] = mod_pow(fac[k + 2], mod - 2);for (int i = k + 1; i >= 0; --i) inv_fac[i] = inv_fac[i + 1] * (i + 1) % mod;solve_number(k + 1);long long ans = 0;for (int i = 1; i <= k; ++i) {for (int j = i; j <= k; ++j)ans = (ans + sum(a[j] - 1) - sum(a[j - 1]) + mod) % mod;int l = a[i];// std::cout << ans << '\n';for (int j = i; j <= k; ++j) a[j] -= l;}std::cout << ans << '\n';
}#undef int
int main() {freopen("defile.in", "r", stdin);freopen("defile.out", "w", stdout);R(t);while (t--) solve();return 0;
}

NOI模拟(5.23) TJOID2T3 教科书般的亵渎 (bzoj5339)相关推荐

  1. 【ybt金牌导航8-3-3】【luogu P4593】分数计算 / 教科书般的亵渎(数学)(拉格朗日插值)

    分数计算 / 教科书般的亵渎 题目链接:ybt金牌导航8-3-3 / luogu P4593 题目大意 有一些怪,血量从 1~n,其中有 m 个数是没有怪的,给出这些数. 然后你可以每次操作攻击所有怪 ...

  2. 教科书般的亵渎(dfs)

    题面: 教科书般的亵渎 Time Limit: 1500MS Memory Limit: 65536K Total Submissions: 36 Accepted: 3 Description &q ...

  3. A - 【深蓝】教科书般的亵渎 (Gym - 102072A )(矩阵快速幂+计算斐波那契数列)

    "现在给大家展示一波教科书般的亵渎" "扭了扭了" 炉石传说是一款比较火的卡牌游戏,不同的卡牌间可以打出许多不可思议的配合. 炉石传说的战斗大部分由随从来完成. ...

  4. P4593-[TJOI2018]教科书般的亵渎【拉格朗日差值】

    正题 题目链接:https://www.luogu.com.cn/problem/P4593 题目大意 场上有若干只怪,最高的为nnn,每个怪血量不同,有mmm个血量不存在. 不停释放亵渎(全场打一, ...

  5. P4593 [TJOI2018]教科书般的亵渎(拉格朗日插值 + k幂次之和)

    洛谷题目链接 题目大意:有点绕,有 n−mn - mn−m 个怪兽,它们的血量在 [1,n][1,n][1,n] 值域上且每个怪兽的血量都不同 (其中 m 个点被挖掉),你每使用一次亵渎会给所有怪兽血 ...

  6. BZOJ5339: [TJOI2018]教科书般的亵渎-组合数学

    传送门 题意: 在炉石传说中有这样的一个场面:n个随从,血量为1~n,现在去除m个随从,然后开始释放"亵渎".每使用一张"亵渎"会获得一定的分数,分数计算如下: ...

  7. 【BZOJ5339】【TJOI2018】教科书般的亵渎

    [题目链接] 点击打开链接 [思路要点] 模拟题目中的过程,我们本质上需要回答\(O(M^2)\)个形如求\(\sum_{i=L}^{R}i^{M+1}\)的询问. 拉格朗日插值即可. 时间复杂度\( ...

  8. bzoj 5339 [TJOI2018]教科书般的亵渎 拉格朗日插值

    题面 题目传送门 解法 可以发现,题目可以转化成求若干个形如\(\sum_{i=1}^ni^k\)的东西 这个东西可以拉格朗日插值 大概讲一下拉格朗日插值是个什么东西: 显然,\(\sum_{i=1} ...

  9. 洛谷P4593 [TJOI2018]教科书般的亵渎(拉格朗日插值)

    题意 题目链接 Sol 打出暴力不难发现时间复杂度的瓶颈在于求\(\sum_{i = 1}^n i^k\) 老祖宗告诉我们,这东西是个\(k\)次多项式,插一插就行了 上面的是\(O(Tk^2)\)的 ...

最新文章

  1. 【转载】springboot:如何优雅的使用mybatis
  2. 光敏电阻检测12528
  3. SQLSERVER常用函数汇总
  4. 计算任何一天是星期几的几种算法
  5. SpringBoot整合Mybatis完整详细版
  6. Nginx笔记-处女篇
  7. 用于SaaS和NoSQL的Jdbi
  8. Linux下WPS自主设置快捷键,电脑wps的word怎么自主设定快捷键
  9. 数据结构实验之排序一:一趟快排
  10. 如何评价个人在软件开发团队中的绩效
  11. NOI入门级数学: 数及其运算 数的进制之二进制
  12. android webview调js方法,Android中WebView与H5的交互,Native与JS方法互调
  13. 结构化数据与非结构化数据理解
  14. OsgEarth加载shp文件问题以及shp文件介绍
  15. 哪有简明python教程下载_简明python教程在哪买!《简明python教程》 下载地址?
  16. 传染病模型-java代码
  17. 机器视觉编码技术与标准进展
  18. 透明网桥对数据帧的处理方式
  19. 基于STM32单片机的智能药盒带语音播报原理图程序
  20. 心理测试单机小软件,十个有趣的心理小测试 好玩的心理测试题

热门文章

  1. 强制删除docker容器
  2. matlab 调制 解调,基于Matlab调制与解调的实现
  3. mysql schema和database_数据库中的Schema和Database的区别
  4. python计算文件md5值_用python计算文件的MD5值
  5. 电脑桌面打开计算机打开多个,电脑怎么打开多个微信
  6. ArcGIS地形分析
  7. 计算机考研邮件模板!复试/调剂联系导师邮件怎么写?
  8. mysql可以更改安装路径吗_Mysql怎样更改安装路径?
  9. ps意外崩溃_Mark!小白实用PS小技巧,秒变PS达人
  10. 为什么说CRM系统与ERP系统整合很重要?