并不对劲的复健训练-bzoj5339:loj2578:p4593:[TJOI2018]教科书般的亵渎
题目大意
题解
先将\(a\)排序。
\(k\)看上去等于怪的血量连续段的个数,但是要注意当存在\(a_i+1=a_{i+1}\)时,虽然它们之间的连续段为空,但是还要算上;而当\(a_m=n\)时,最后一段连续段不用算。
考虑进行游戏的过程:设当前最大血量为\(p\),正在打出第\(q\)张亵渎,那么得到的分数是:\(\sum\limits_{i=1}^p i^k-\sum\limits_{i=q}^{m}(a_i-a_{q-1})^k\)。
后一部分可以直接求。
前一部分\(\sum\limits_{i=1}^p i^k\),通过观察查看题解发现求它的公式是个关于\(p\)的\(k+1\)次多项式,可以把\(p=1,2,...,k+2\)的值代入暴力求解,得到\(k+2\)个在该多项式的曲线上的点,然后通过拉格朗日插值求该多项式。
代码
#include<algorithm>
#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<ctime>
#include<iomanip>
#include<iostream>
#include<map>
#include<queue>
#include<set>
#include<stack>
#include<vector>
#define rep(i,x,y) for(register int i=(x);i<=(y);++i)
#define dwn(i,x,y) for(register int i=(x);i>=(y);--i)
#define view(u,k) for(int k=fir[u];~k;k=nxt[k])
#define LL long long
#define maxn 57
using namespace std;
LL read()
{
LL x=0,f=1;char ch=getchar();
while(!isdigit(ch)&&ch!='-')ch=getchar();
if(ch=='-')f=-1,ch=getchar();
while(isdigit(ch))x=(x<<1)+(x<<3)+ch-'0',ch=getchar();
return x*f;
}
void write(int x)
{
if(x==0){putchar('0'),putchar('\n');return;}
int f=0;char ch[20];
if(x<0)putchar('-'),x=-x;
while(x)ch[++f]=x%10+'0',x/=10;
while(f)putchar(ch[f--]);
putchar('\n');
return;
}
const LL mod=1e9+7;
LL n,a[maxn];
int t,m,f[maxn],b[maxn],qy[maxn],ans,sz,k;
int mul(int x,int y){int res=1;while(y){if(y&1)res=(LL)res*x%mod;x=(LL)x*x%mod,y>>=1;}return res;}
int mo(int x){return x>=mod?x-mod:x;}
void prew()
{
rep(i,1,sz)qy[i]=mo(qy[i-1]+mul(i,k)),f[i]=0;
f[0]=1;
rep(i,1,sz)dwn(j,i,1)f[j]=mo(f[j]+(LL)f[j-1]*(mod-i)%mod);
reverse(f,f+sz+1);
rep(i,1,sz)
{
int lst=0,num=1,nyx=mul(mod-i,mod-2);
rep(j,1,sz)if(i!=j)num=(LL)num*mo(i-j+mod)%mod;
num=(LL)mul(num,mod-2)*qy[i]%mod;
rep(i,0,sz-1)
{
lst=(LL)mo(f[i]-lst+mod)*nyx%mod,b[i]=mo(b[i]+(LL)lst*num%mod);
}
}
}
int getf(LL x)
{
if(x<=0)return 0;
x%=mod;
int res=0,now=1;
rep(i,0,sz-1)res=mo(res+(LL)b[i]*now%mod),now=(LL)now*x%mod;
return res;
}
int main()
{
t=read();
while(t--)
{
n=read(),m=read(),ans=0;k=m+1;
rep(i,1,m)a[i]=read();
sort(a+1,a+m+1);
if(a[m]==n)k--;
else a[++m]=n+1;sz=k+2;
prew();
rep(i,1,m)
{
ans=mo(ans+getf(a[m]-a[i-1]-1));
rep(j,i,m-1)ans=mo(ans-mul(a[j]-a[i-1],k)+mod);
}
write(ans);
rep(i,0,sz)b[i]=0;
}
return 0;
}
一些感想
说到求自然数幂和,就不得不说某年省选day1t3……
仔细想想,对于某些手很健康的人来说,可能写拉格朗日插值比写暴力的正解快?
并不对劲的复健训练-bzoj5339:loj2578:p4593:[TJOI2018]教科书般的亵渎的更多相关文章
- 【BZOJ5339】[TJOI2018]教科书般的亵渎(斯特林数)
[BZOJ5339][TJOI2018]教科书般的亵渎(斯特林数) 题面 BZOJ 洛谷 题解 显然交亵渎的次数是\(m+1\). 那么这题的本质就是让你求\(\sum_{i=1}^n i^{m+1} ...
- 并不对劲的复健训练-CF1187D
题目大意 有两个长度为\(n\)的序列\(a_1,...,a_n\),\(b_1,...,b_n\)(\(a,b\leq n\leq 3\times 10^5\) ).一次操作是选取 \([l,r]\ ...
- 并不对劲的复健训练-bzoj5250:loj2473:p4365:[九省联考2018]秘密袭击
题目大意 有一棵\(n\)(\(n\leq 1666\))个点的树,有点权\(d_i\),点权最大值为\(w\)(\(w\leq 1666\)).给出\(k\)(\(k\leq n\)),定义一个选择 ...
- 并不对劲的复健训练-CF1205B Shortest Cycle
题目大意 有\(n\)(\(n\leq 10^5\))个数\(a_1,...,a_n\)(\(a\leq 10^{18}\)).有一个图用这个方法生成:若\(a_i\)按位与\(a_j\)不为0,则在 ...
- 并不对劲的复健训练-p5212 SubString
题目大意 有一个串\(s\),一开始只知道它的一个前缀.有\(q\)(\(q\leq 10^4\))个操作,操作有两种:1.给一个字符串,表示\(s\)(\(s\)总长\(\leq 6\times 1 ...
- 并不对劲的复健训练-bzoj5249:loj2472:p4364[2018多省联考]IIIDX
题目大意 给出\(n,k,d_1,...,d_n\)(\(n\leq 5\times 10^5,1<k\leq 10^9,d\leq 10^9,k\in R\)).有一个满足 对于每个点\(i\ ...
- 并不对劲的复健训练-bzoj5253:loj2479:p4384:[2018多省联考]制胡窜
题目大意 给出一个字符串\(S\),长度为\(n\)(\(n\leq 10^5\)),\(S[l:r]\)表示\(S_l,S_{l+1}...,S_r\)这个子串.有\(m\)(\(m\leq 3\t ...
- 并不对劲的复健训练-bzoj5301:loj2534:p4462 [CQOI2018]异或序列
题目大意 给出一个序列\(a_1,...,a_n\)(\(a,n\leq 10^5\)),一个数\(k\)(\(k\leq 10^5\)),\(m\)(\(m\leq10^5\))次询问,每次询问给\ ...
- 并不对劲的复健训练-p3674
题目大意 给出序列$ a_1,...,a_n $ ( $ n\leq10^5,a\leq 10^5 $ ),有\(m\) ( \(m\leq 10^5\))个以下三类询问: (1)给出\(l,r,k\ ...
随机推荐
- The JAVA_HOME environment variable is not defined correctly的错误
The JAVA_HOME environment variable is not defined correctlyThis environment variable is needed to ru ...
- springMVC课程笔记(二)springMVC组件配置
1.springMVC的DispatcherServlet前段控制器配置,如下图所示在web.xml中配置如下内容: 2.在spring配置文件中,配置处理器适配器HandlerAdapter和映射器 ...
- springboot发送邮件,以及携带邮件附件简单使用
可以通过springboot官方文档中Sending Email,找到类似如下java mail的使用文档 https://docs.spring.io/spring/docs/5.1.9.RELEA ...
- BOM问题
在php编写中,很多人喜欢用notepad editplus 等等在windows下编写程序, 这就很容易出现一个问题,那就是文件签名的东西--BOM!所谓BOM,全称是Byte Order Mark ...
- ThinkPHP数据查询与添加语句
在ThinkPHP框架中实现数据的查询操作 function ShowAll() { //Model:数据库中每张表对应一个模型 //类名是表名,类里面的成员变量是列名 //把一张表对应一个类,其中一 ...
- 优化webpack打包速度方案
基本原理要么不进行打包:要么缓存文件,不进行打包:要么加快打包速度. 不进行打包方案: 1,能够用CDN处理的用CDN处理,比如项目引入的第三方依赖jquery.js,百度编辑器 先进行打包或者缓存然 ...
- Pro JavaScript List.11-11
//为实现各种现代浏览器的requestAnimationFrame()方法,创建一段简单的跨浏览器保障代码(polyfill),以实现流畅.高效的动画.由保罗•艾里什(Paul Irish)编写,网 ...
- Requests API
Requests API http://docs.python-requests.org/en/latest/ requests的具体安装过程请看: http://docs.python-reques ...
- Centos7.4 下cobbler安装及配置
1.背景介绍 作为运维,在公司经常遇到一些机械性重复工作要做,例如:为新机器装系统,一台两台机器装系统,可以用光盘.U盘等介质安装,1小时也完成了,但是如果有成百台的服务器还要用光盘.U盘去安装,就显 ...
- presto安装
下载 presto-server-0.217 包 进入presto根目录,新建脚本deploy.sh mkdir etc cd etc #配置 cat >config.properties &l ...