BZOJ5339: [TJOI2018]教科书般的亵渎-组合数学
传送门
题意:
在炉石传说中有这样的一个场面:n个随从,血量为1~n,现在去除m个随从,然后开始释放“亵渎”。每使用一张“亵渎”会获得一定的分数,分数计算如下:在使用一张“亵渎”之后,每一个被亵渎造成伤害的怪会产生 xk x k x^k的分数,其中x是造成伤害前怪的血量,k是需要杀死所有怪物所需的“亵渎”的张数。
n≤1013m≤50 n ≤ 10 13 m ≤ 50 n≤10^{13} m≤50
Solution:
可以发现这是若干个形如 Sum(n,k)=∑ni=1ik S u m ( n , k ) = ∑ i = 1 n i k Sum(n,k)=\sum_{i=1}^ni^k的式子组成的
这就是经典的自然数幂和问题了
可以用累加法:
首先有一个式子: (n+1)k−nk=∑ki=1Cik∗nk−i ( n + 1 ) k − n k = ∑ i = 1 k C k i ∗ n k − i (n+1)^k-n^k=\sum_{i=1}^kC_k^i*n^{k-i}
左边组合意义是k个球涂n+1种颜色的方案数和k个球涂n种颜色的方案数
右边组合意义是在k个球选一些球涂第n+1种颜色,其他球随便涂的方案数
然后我们可以通过上面的式子列出若干式子:
(n+1)k−nk=∑ki=1Cik∗nk−i ( n + 1 ) k − n k = ∑ i = 1 k C k i ∗ n k − i (n+1)^k-n^k=\sum_{i=1}^kC_k^i*n^{k-i}
nk−(n−1)k=∑ki=1Cik∗(n−1)k−i n k − ( n − 1 ) k = ∑ i = 1 k C k i ∗ ( n − 1 ) k − i n^k-(n-1)^k=\sum_{i=1}^kC_k^i*(n-1)^{k-i}
(n−1)k−(n−2)k=∑ki=1Cik∗(n−2)k−i ( n − 1 ) k − ( n − 2 ) k = ∑ i = 1 k C k i ∗ ( n − 2 ) k − i (n-1)^k-(n-2)^k=\sum_{i=1}^kC_k^i*(n-2)^{k-i}
... . . . ...
2k−1k=∑ki=1Cik∗1k−i 2 k − 1 k = ∑ i = 1 k C k i ∗ 1 k − i 2^k-1^k=\sum_{i=1}^kC_k^i*1^{k-i}
全都加起来可以得到: (n+1)k−1=∑ki=1Cik∗Sum(n,k−i) ( n + 1 ) k − 1 = ∑ i = 1 k C k i ∗ S u m ( n , k − i ) (n+1)^k-1=\sum_{i=1}^kC_k^i*Sum(n,k-i)
即 (n+1)k+1−1=∑k+1i=1Cik+1∗Sum(n,k−i+1) ( n + 1 ) k + 1 − 1 = ∑ i = 1 k + 1 C k + 1 i ∗ S u m ( n , k − i + 1 ) (n+1)^{k+1}-1=\sum_{i=1}^{k+1}C_{k+1}^i*Sum(n,k-i+1)
(n+1)k+1−1=∑k+1i=2Cik+1∗Sum(n,k−i+1)+(k+1)∗Sum(n,k) ( n + 1 ) k + 1 − 1 = ∑ i = 2 k + 1 C k + 1 i ∗ S u m ( n , k − i + 1 ) + ( k + 1 ) ∗ S u m ( n , k ) (n+1)^{k+1}-1=\sum_{i=2}^{k+1}C_{k+1}^i*Sum(n,k-i+1)+(k+1)*Sum(n,k)
Sum(n,k)=(n+1)k+1−1−∑k−1i=0Cik+1∗Sum(n,i)k+1 S u m ( n , k ) = ( n + 1 ) k + 1 − 1 − ∑ i = 0 k − 1 C k + 1 i ∗ S u m ( n , i ) k + 1 Sum(n,k)=\frac{(n+1)^{k+1}-1-\sum_{i=0}^{k-1}C_{k+1}^i*Sum(n,i)} {k+1}
这样我们就可以 O(k2) O ( k 2 ) O(k^2)的递推了,临界点是 Sum(n,0)=n S u m ( n , 0 ) = n Sum(n,0)=n 记忆化搜索即可
代码:
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int mod=1e9+7;
long long n,nw,a[55];
int T,mi,k,ans[55],c[55][55];
int fast_pow(int x,int a)
{int ans=1;for (;a;x=1ll*x*x%mod,a>>=1)if (a&1) ans=1ll*ans*x%mod;return ans;
}
int S(int k)
{if (k==0) return nw%mod;if (ans[k]) return ans[k];int Ans=fast_pow((nw+1)%mod,k+1);//cout<<Ans<<endl;int jian=1;for (int i=0;i<=k-1;i++) jian=(jian+1ll*c[i][k+1]*S(i))%mod;Ans=(Ans+mod-jian)%mod;Ans=(1ll*Ans*fast_pow(k+1,mod-2))%mod;ans[k]=Ans;return Ans;
}
int main()
{c[0][0]=1;for (int i=1;i<=52;i++){c[0][i]=1;for (int j=1;j<=i;j++) c[j][i]=(1ll*c[j][i-1]+c[j-1][i-1])%mod;}scanf("%d",&T);while (T--){scanf("%lld%d",&n,&k);for (int i=1;i<=k;i++) scanf("%lld",&a[i]);sort(a+1,a+1+k);mi=k+1;int tot=0;nw=n;for (int i=1;i<=k;i++){memset(ans,0,sizeof(ans));tot=(1ll*tot+S(mi))%mod;for (int j=i;j<=k;j++) tot=(1ll*tot-fast_pow((a[j]-n+nw)%mod,mi)+mod)%mod;//cout<<tot<<endl;nw-=a[i]-a[i-1];}memset(ans,0,sizeof(ans));//cout<<nw<<endl;tot=(1ll*tot+S(mi))%mod;printf("%d\n",tot);}
}
BZOJ5339: [TJOI2018]教科书般的亵渎-组合数学相关推荐
- P4593 [TJOI2018]教科书般的亵渎(拉格朗日插值 + k幂次之和)
洛谷题目链接 题目大意:有点绕,有 n−mn - mn−m 个怪兽,它们的血量在 [1,n][1,n][1,n] 值域上且每个怪兽的血量都不同 (其中 m 个点被挖掉),你每使用一次亵渎会给所有怪兽血 ...
- bzoj 5339 [TJOI2018]教科书般的亵渎 拉格朗日插值
题面 题目传送门 解法 可以发现,题目可以转化成求若干个形如\(\sum_{i=1}^ni^k\)的东西 这个东西可以拉格朗日插值 大概讲一下拉格朗日插值是个什么东西: 显然,\(\sum_{i=1} ...
- 洛谷P4593 [TJOI2018]教科书般的亵渎(拉格朗日插值)
题意 题目链接 Sol 打出暴力不难发现时间复杂度的瓶颈在于求\(\sum_{i = 1}^n i^k\) 老祖宗告诉我们,这东西是个\(k\)次多项式,插一插就行了 上面的是\(O(Tk^2)\)的 ...
- 洛谷P4593 [TJOI2018]教科书般的亵渎
链接 点击跳转 题解 分析之后,发现这个题主要是解决这个问题: 求 ∑ i = 1 n i k \sum_{i=1}^n i^k i=1∑nik 根据某些数学上的结论,这个东西是一个包含 n n n ...
- NOI模拟(5.23) TJOID2T3 教科书般的亵渎 (bzoj5339)
教科书般的亵渎 题目背景: 5.23 模拟 TJOI2018D2T3 分析:拉格朗日差值 这个题的题意怕不是有毒,注意他每一次的k是相同的,为总共要用多少次卡片,然后卡片是每次先将所有的数减一,如果这 ...
- 【ybt金牌导航8-3-3】【luogu P4593】分数计算 / 教科书般的亵渎(数学)(拉格朗日插值)
分数计算 / 教科书般的亵渎 题目链接:ybt金牌导航8-3-3 / luogu P4593 题目大意 有一些怪,血量从 1~n,其中有 m 个数是没有怪的,给出这些数. 然后你可以每次操作攻击所有怪 ...
- 教科书般的亵渎(dfs)
题面: 教科书般的亵渎 Time Limit: 1500MS Memory Limit: 65536K Total Submissions: 36 Accepted: 3 Description &q ...
- A - 【深蓝】教科书般的亵渎 (Gym - 102072A )(矩阵快速幂+计算斐波那契数列)
"现在给大家展示一波教科书般的亵渎" "扭了扭了" 炉石传说是一款比较火的卡牌游戏,不同的卡牌间可以打出许多不可思议的配合. 炉石传说的战斗大部分由随从来完成. ...
- 【BZOJ5339】【TJOI2018】教科书般的亵渎
[题目链接] 点击打开链接 [思路要点] 模拟题目中的过程,我们本质上需要回答\(O(M^2)\)个形如求\(\sum_{i=L}^{R}i^{M+1}\)的询问. 拉格朗日插值即可. 时间复杂度\( ...
最新文章
- SO做了Booked之后,一直处理于“已延交”,发运事务处理的活动区变灰
- 如何设计一个深度学习项目
- 4j 设置日志保存天数_MySQL中的这几类日志,你一定要知道
- python语言用什么来表明每行代码的层次关系_《计算机二级Python语言程序设计考试》第2章: Python语言基本语法元素...
- openhub_介绍OpenHub框架
- 提取tsv数据并转化成json——致找不出怎么提取tsv文件中数据的五小时
- mysql报错1517_请教一下 flask+sqlalchemy+mysql 连接错误问题
- 【Android】3.24 示例24--OpenGL绘制功能
- POJ 3669 简单BFS
- Android Studio新建工程syncing失败;Android studio Connection timed out: connect
- win7 Ftp搭建
- python绘制正多边形_python : turtle 画正多边形
- 使用plist文件进行ipa的安装
- 【车间调度】改进的帝国企鹅算法求解车间调度问题【含Matlab源码 2041期】
- 大数据华而不实么?大数据的本质是什么?
- 1 Bootstrap 4起步
- 火影忍者中的天才七忍者
- Android Webview使用自定义字体加载网页
- 个人大数据征信查询浅谈与撸待现象
- 20190827-Ubuntu查看内存槽的数目及内存信息
热门文章
- AXURE教程:散点图
- java体育管理系统6,基于JAVA的体育场馆预约管理系统的设计与实现.docx
- M1 24寸iMac值不值得购买?24寸iMac测评
- 竣达技术四路交流电电压电流监测单元
- netty框架及原理解析
- C++软件工程师之什么是宏?
- 【MOS】OCR/Vote disk 维护操作: (添加/删除/替换/移动) (文档 ID 1674859.1)
- HoloLens开发环境安装部署(基于Unity2018.4/VS2017/MRTK)
- 解决spirng无法注入redis工具类及dao层类(Springboot项目)
- 低频功率放大器参考电路图解大全