「TJOI 2018」教科书般的亵渎

题目描述

小豆喜欢玩游戏,现在他在玩一个游戏遇到这样的场面,每个怪的血量为 \(a_i\) ,且每个怪物血量均不相同, 小豆手里有无限张“亵渎”。

亵渎的效果是对所有的怪造成 \(1\) 点伤害,如果有怪死亡,则再次施放该法术。我们认为血量为 \(0\) 的怪物死亡。

小豆使用一张“亵渎”会获得一定的分数,分数计算如下,在使用一张“亵渎”之后,每一个被亵渎造成伤害的怪会产生 \(x^k\) ,其中 \(x\) 是造成伤害前怪的血量为 \(x\) 和需要杀死所有怪物所需的“亵渎”的张数 \(k\) 。

\(N \leq 1000, K \leq 15\)

解题思路 :

考虑将没有出现的血量集合 \(m_i\) 从小到大排序,观察发现对于每一个 \(m_i\) ,其会使得所有血量 \(-m_i\)

设此时场上的最大血量为 \(c\) ,那么其能产生的贡献就是 \((\sum_{j=1}^{c} j^k) - \sum_{j=i}^{m} m_i\ ^k\)

由于 \(m\) 很小,计算后面式子的复杂度可以忽略不计,问题就转化为快速计算前面的式子

观察发现前面的式子其实就是一个 \(k + 1\) 次的多项式,暴力插值求解即可

/*program by mangoyang*/
#include<bits/stdc++.h>
#define inf (0x7f7f7f7f)
#define Max(a, b) ((a) > (b) ? (a) : (b))
#define Min(a, b) ((a) < (b) ? (a) : (b))
typedef long long ll;
using namespace std;
template <class T>
inline void read(T &x){
int f = 0, ch = 0; x = 0;
for(; !isdigit(ch); ch = getchar()) if(ch == '-') f = 1;
for(; isdigit(ch); ch = getchar()) x = x * 10 + ch - 48;
if(f) x = -x;
}
#define int ll
const int Mod = 1000000007;
vector<int> x, y;
int a[105], n, m;
inline int Pow(int a, int b){
int ans = 1; a %= Mod;
for(; b; b >>= 1, a = a * a % Mod)
if(b & 1) ans = ans * a % Mod;
return ans;
}
inline void Prework(int k){
x.clear(), y.clear();
for(int i = 1, now = 0; i <= k + 2; i++)
x.push_back(i), y.push_back((now += Pow(i, k)) %= Mod);
}
inline int calc(int now){
int res = 0;
for(int i = 0; i < x.size(); i++){
int tmp = y[i];
for(int j = 0; j < x.size(); j++) if(j != i)
(tmp *= (now - x[j]) % Mod * Pow(x[i] - x[j], Mod - 2) % Mod) %= Mod;
(res += tmp) %= Mod;
}
return res;
}
inline void solve(){
int ans = 0, now = 0;
read(n), read(m), Prework(m + 1);
for(int i = 1; i <= m; i++) read(a[i]);
sort(a + 1, a + m + 1);
for(int i = 1; i <= m; i++){
(ans += calc(n - now)) %= Mod;
for(int j = i; j <= m; j++) (ans -= Pow(a[j] - now, m + 1)) %= Mod;
now = a[i];
}
(ans += calc(n - now)) %= Mod;
cout << ((ans % Mod) + Mod) % Mod << endl;
}
signed main(){
int T; read(T); while(T--) solve();
return 0;
}

「TJOI 2018」教科书般的亵渎的更多相关文章

  1. 「TJOI 2018」游园会 Party

    「TJOI 2018」游园会 Party 题目描述 小豆参加了 \(NOI\) 的游园会,会场上每完成一个项目就会获得一个奖章,奖章只会是 \(N, O, I\) 的字样. 在会场上他收集到了 \(K ...

  2. LOJ #2542. 「PKUWC 2018」随机游走(最值反演 + 树上期望dp + FMT)

    写在这道题前面 : 网上的一些题解都不讲那个系数是怎么推得真的不良心 TAT (不是每个人都有那么厉害啊 , 我好菜啊) 而且 LOJ 过的代码千篇一律 ... 那个系数根本看不出来是什么啊 TAT ...

  3. 【BZOJ5339】[TJOI2018]教科书般的亵渎(斯特林数)

    [BZOJ5339][TJOI2018]教科书般的亵渎(斯特林数) 题面 BZOJ 洛谷 题解 显然交亵渎的次数是\(m+1\). 那么这题的本质就是让你求\(\sum_{i=1}^n i^{m+1} ...

  4. LOJ #2802. 「CCC 2018」平衡树(整除分块 + dp)

    题面 LOJ #2802. 「CCC 2018」平衡树 题面有点难看...请认真阅读理解题意. 转化后就是,给你一个数 \(N\) ,每次选择一个 \(k \in [2, N]\) 将 \(N\) 变 ...

  5. LOJ #2541. 「PKUWC 2018」猎人杀(容斥 , 期望dp , NTT优化)

    题意 LOJ #2541. 「PKUWC 2018」猎人杀 题解 一道及其巧妙的题 , 参考了一下这位大佬的博客 ... 令 \(\displaystyle A = \sum_{i=1}^{n} w_ ...

  6. LOJ #2540. 「PKUWC 2018」随机算法(概率dp)

    题意 LOJ #2540. 「PKUWC 2018」随机算法 题解 朴素的就是 \(O(n3^n)\) dp 写了一下有 \(50pts\) ... 大概就是每个点有三个状态 , 考虑了但不在独立集中 ...

  7. LOJ #2538. 「PKUWC 2018」Slay the Spire (期望dp)

    Update on 1.5 学了 zhou888 的写法,真是又短又快. 并且空间是 \(O(n)\) 的,速度十分优秀. 题意 LOJ #2538. 「PKUWC 2018」Slay the Spi ...

  8. loj#2054. 「TJOI / HEOI2016」树

    题目链接 loj#2054. 「TJOI / HEOI2016」树 题解 每次标记覆盖整棵字数,子树维护对于标记深度取max dfs序+线段树维护一下 代码 #include<cstdio> ...

  9. 「TJOI / HEOI2016」字符串

    「TJOI / HEOI2016」字符串 题目描述 佳媛姐姐过生日的时候,她的小伙伴从某东上买了一个生日礼物.生日礼物放在一个神奇的箱子中.箱子外边写了一个长为 \(n\) 的字符串 \(s\),和 ...

随机推荐

  1. 【BZOJ】2599: [IOI2011]Race 点分治

    [题意]给一棵树,每条边有权.求一条简单路径,权值和等于K,且边的数量最小.N <= 200000, K <= 1000000.注意点从0开始编号,无解输出-1. [算法]点分治 [题解] ...

  2. 多进程Process

    多进程旧式写法 from multiprocessing import Pool def f(x): return x*x if __name__ == '__main__': p = Pool(5) ...

  3. jQuery domready

    在jQuery里面,我们可以看到两种写法: $(function(){ //todo }) $(document).ready(function(){ //todo }) 这两个方法的效果都是一样的, ...

  4. pycharm设置字体大小

    pycharm 是很好的一个IDE,在windows下,和macOS下,都能很好的运行.唯一缺点是启动慢. 默认字体太小,在mac下,需要瞪大24K氪金狗眼才能看清. 为了保护好眼睛,我们需要把字体调 ...

  5. java类中访问属性

    package first; public class for_protect { private int age=10; int number = 100; public void show(){ ...

  6. 【Python学习】csv库

    csv(Comma-Separated Values, 逗号分割值)是存储表格数据的常用文件格式. 它每一行都用一个换行符分隔,列与列之间用逗号分隔. 本地文件 Python的csv库可以非常简单地修 ...

  7. Ubuntu下安装Sublime Text3

    1. 下载软件 Ctrl+Alt+T 调出命令窗口执行下面命令下载安装包: sudo add-apt-repository ppa:webupd8team/sublime-text-3 2. 更新软件 ...

  8. loadrunner中大小写字符转换函数封装:

    //封装ConvertToXXX函数: int ConvertToUpper(char * sInput, char * sNew) { sInput = (char *)strupr(sInput) ...

  9. 将 sublime test3 添加到鼠标右键的方法

    将 sublime test3 添加到鼠标右键的方法 将 sublime_addright.inf 文件放到 sublime text 安装目录进行安装即可. 文件名:sublime_addright ...

  10. python动态获取对象的属性和方法 (转)

    转自未知,纯个人笔记使用 首先通过一个例子来看一下本文中可能用到的对象和相关概念. #coding:utf-8 import sys def foo():pass class Cat(object): ...