洛谷P4593 [TJOI2018]教科书般的亵渎 【数学】
题目链接
题解
upd:经典的自然数幂和,伯努利数裸题
由题我们只需模拟出代价,只需使用\(S(n,k) = \sum\limits_{i = 1}^{n} i^{k}\)这样的前缀和计算
我不知道怎么来的这样一个公式:
\]
这玩意怎么来的呢?
左边为\((n + 1)^k - n^k\),\((n+1)^k\)可以看做有\(k\)个位置进行染色,每个位置有\(n + 1\)种染色的方案数,减去\(n^k\),就代表了拥有第\(n + 1\)种颜色的染色方案数
那么这个等式就很好理解了,我们枚举第\(n + 1\)种颜色染了多少个,就得到了右式
我们发现这个公式右侧涵盖了所有\(n^i \quad[ i \in [0,k]]\)的项,我们令\(k = k + 1\),如果我们将所有\(n\)枚举出来,将会的得到:
(n + 1)^{k + 1} - n^{k + 1} &= \sum\limits_{i = 1}^{k + 1} {k + 1\choose i}n^{k + 1 - i} \\
n^{k + 1} - (n - 1)^{k + 1} &= \sum\limits_{i = 1}^{k + 1} {k + 1\choose i}(n - 1)^{k + 1 - i} \\
......... \\
2^{k + 1} - 1^{k + 1} &= \sum\limits_{i = 1}^{k + 1} {k + 1\choose i}1^{k + 1 - i} \\
\end{aligned}
\]
全部相加,得到:
\]
取出\(S(n,k)\)
\]
发现就可以\(O(k^2)\)递推了
由于模拟也是\(O(k^2)\)的
所以最终复杂度\(O(k^4)\)
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<map>
#define Redge(u) for (int k = h[u],to; k; k = ed[k].nxt)
#define REP(i,n) for (int i = 1; i <= (n); i++)
#define mp(a,b) make_pair<int,int>(a,b)
#define cls(s) memset(s,0,sizeof(s))
#define cp pair<int,int>
#define LL long long int
using namespace std;
const int maxn = 105,maxm = 100005,INF = 1000000000,P = 1000000007;
inline LL read(){
LL out = 0,flag = 1; char c = getchar();
while (c < 48 || c > 57){if (c == '-') flag = -1; c = getchar();}
while (c >= 48 && c <= 57){out = (out << 3) + (out << 1) + c - 48; c = getchar();}
return out * flag;
}
LL a[maxn],fac[maxn],fv[maxn],inv[maxn],n,m,K;
void init(){
fac[0] = fac[1] = fv[0] = fv[1] = inv[0] = inv[1] = 1;
for (int i = 2; i < maxn; 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;
}
}
LL C(LL n,LL m){
return 1ll * fac[n] * fv[m] % P * fv[n - m] % P;
}
LL qpow(LL a,LL b){
LL ans = 1; a %= P;
for (; b; b >>= 1,a = a * a % P)
if (b & 1) ans = ans * a % P;
return ans;
}
LL f[maxn];
LL S(LL n,LL k){
if (!n) return 0;
f[0] = n % P;
for (int i = 1; i <= k; i++){
LL tmp = 0;
for (int j = 0; j <= i - 1; j++)
tmp = (tmp + C(i + 1,j) * f[j] % P) % P;
f[i] = (((qpow(n + 1,i + 1) - 1) % P - tmp) % P + P) % P * inv[i + 1] % P;
}
return f[k];
}
LL b[maxn];
int main(){
init();
int T = read();
while (T--){
n = read(); m = read(); K = m + 1;
REP(i,m) a[i] = read(); a[K] = n + 1;
sort(a + 1,a + 1 + K);
LL ans = 0;
for (int i = 0; i <= m; i++){
for (int j = i; j <= m; j++){
ans = ((ans + (S(a[j + 1] - 1,K) - S(a[j],K)) % P) % P + P) % P;
}
LL len = a[i + 1] - a[i];
for (int j = i + 1; j <= K; j++) a[j] -= len;
}
printf("%lld\n",ans);
}
return 0;
}
洛谷P4593 [TJOI2018]教科书般的亵渎 【数学】的更多相关文章
- 洛谷 P4593 [TJOI2018]教科书般的亵渎
洛谷 P4593 [TJOI2018]教科书般的亵渎 神仙伯努利数...网上一堆关于伯努利数的东西但是没有证明,所以只好记结论了? 题目本质要求\(\sum_{i=1}^{n}i^k\) 伯努利数,\ ...
- 洛谷P4593 [TJOI2018]教科书般的亵渎
小豆喜欢玩游戏,现在他在玩一个游戏遇到这样的场面,每个怪的血量为\(a_i\),且每个怪物血量均不相同,小豆手里有无限张"亵渎".亵渎的效果是对所有的怪造成\(1\)点伤害,如果 ...
- 洛谷P4593 [TJOI2018]教科书般的亵渎(拉格朗日插值)
题意 题目链接 Sol 打出暴力不难发现时间复杂度的瓶颈在于求\(\sum_{i = 1}^n i^k\) 老祖宗告诉我们,这东西是个\(k\)次多项式,插一插就行了 上面的是\(O(Tk^2)\)的 ...
- P4593 [TJOI2018]教科书般的亵渎(拉格朗日插值)
传送门 首先所有亵渎的张数\(k=m+1\),我们考虑每一次使用亵渎,都是一堆\(i^k\)之和减去那几个没有出现过的\(j^k\),对于没有出现过的我们可以直接快速幂处理并减去,所以现在的问题就是如 ...
- Luogu P4593 [TJOI2018]教科书般的亵渎
亵渎终于离开标准了,然而铺场快攻也变少了 给一个大力枚举(无任何性质)+艹出自然数幂和的方法,但是复杂度极限是\(O(k^4)\)的,不过跑的好快233 首先简单数学分析可以得出\(k=m+1\),因 ...
- 并不对劲的复健训练-bzoj5339:loj2578:p4593:[TJOI2018]教科书般的亵渎
题目大意 题目链接 题解 先将\(a\)排序. \(k\)看上去等于怪的血量连续段的个数,但是要注意当存在\(a_i+1=a_{i+1}\)时,虽然它们之间的连续段为空,但是还要算上:而当\(a_m= ...
- p4593 [TJOI2018]教科书般的亵渎
分析 我们发现$Ans = \sum_i \sum_j (j-p_i)^{m+1}$ 因此直接套用622f的方法即可 代码 #include<bits/stdc++.h> using na ...
- 【BZOJ5339】[TJOI2018]教科书般的亵渎(斯特林数)
[BZOJ5339][TJOI2018]教科书般的亵渎(斯特林数) 题面 BZOJ 洛谷 题解 显然交亵渎的次数是\(m+1\). 那么这题的本质就是让你求\(\sum_{i=1}^n i^{m+1} ...
- BZOJ.5339.[TJOI2018]教科书般的亵渎(拉格朗日插值) & 拉格朗日插值学习笔记
BZOJ 洛谷 题意的一点说明: \(k\)次方这个\(k\)是固定的,也就是最初需要多少张亵渎,每次不会改变: 因某个怪物死亡引发的亵渎不会计分. 不难发现当前所需的张数是空格数+1,即\(m+1\ ...
随机推荐
- vertical-align垂直居中
<div id="content"> <div id="weizi"> 锄禾日当午,<br> 汗滴禾下土.<br> ...
- 百度app红包? 百度全家桶?果断卸载
听说今年的春晚红包与百度合作.这不 刚又下载了一个百度app,之前下载过,太卡了,用户体验极.本身对百度也没啥好感,再加上这周看了:百度已死的文章,搜索全百家号.具体啥情况,你们百度搜一搜吧
- python函数的返回值
返回值:return1.没有返回值 #不写return #只写return:结束一个函数 #return None2.有一个返回值 #可以返回任何数据类型 #只要返回就可 ...
- python继续函数-练习(2017-8-3)
写函数,计算传入字符串中[数字].[字母].[空格] 以及 [其他]的个数 def detection(p): intcount = 0 strcount = 0 othercount = 0 spa ...
- dz论坛Discuz_X3.4最新网站漏洞
近期我们sinesafe安全部门审计discuz最新版的时候发现配置文件写入导致代码执行的问题.cms安装的时候一般会分为几个步骤去进行,其中有对配置文件config进行写入的步骤,当写入的时候未严格 ...
- go 操作数据库
假设有了数据库,创建表 CREATE TABLE `userinfo` ( `uid` INT(10) NOT NULL AUTO_INCREMENT, //自增字段 `username` VARCH ...
- 一笔画问题 南阳acm42(貌似没用到什么算法)
一笔画问题 时间限制:3000 ms | 内存限制:65535 KB 难度:4 描述 zyc从小就比较喜欢玩一些小游戏,其中就包括画一笔画,他想请你帮他写一个程序,判断一个图是否能够用一笔画下 ...
- requests模块基础
requests模块 .caret, .dropup > .btn > .caret { border-top-color: #000 !important; } .label { bor ...
- Angularjs 跨域post数据到springmvc
先贴网上己有解决方案链接: http://www.tuicool.com/articles/umymmqY (讲的是springmvc怎么做才可以跨域) http://my.oschina.net/ ...
- python基础之进程间通信、进程池、协程
进程间通信 进程彼此之间互相隔离,要实现进程间通信(IPC),multiprocessing模块支持两种形式:队列和管道,这两种方式都是使用消息传递的. 进程队列queue 不同于线程queue,进程 ...