首先,如果排列确定,那么就可以组合学解决了,不过排列数很多,显然不能枚举。

我们发现如果区间不能重叠的话,总长度减去所有区间长度就是能用的多余格子数。

然而相邻区间可以重叠较小区间一半的长度,因此这些长度就可以作为额外的多余格子!

因此,我们发现,确定排列的目的是确定有多少多余的格子能用。

考虑把魔法师按攻击范围从大到小排序,然后逐个插入

一开始有一个洞,每插一个可以减少一个洞、不变或增加一个洞(洞就表示还能再插)

令dp[i][j][k]表示现在插了i个,有j个洞,目前有k个额外的格子。

然后随便插一插搞一搞

答案即为dp[n][0][i]*C(L+i+n,n)的和

空间时间均为O(n^4+LlogP)

//我觉得我的复杂度应该有问题……TAT

#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <cstdlib>
#include <algorithm>
#define ll long long
#define N 43
#define M 1702
#define P 1000000007 using namespace std;
int fast_pow(int x,int y){
int ret=1;
while (y){
if (y&1) ret=(ll)ret*x%P;
x=(ll)x*x%P;
y=y>>1;
}
return ret;
}
int n,d[N];
int dp[N][N][M];
int L;
int fact[1000006+M],inv[1000006+M];
int c(int n,int m){return (ll)fact[n]*inv[m]%P*inv[n-m]%P;} int main(){
scanf("%d%d",&L,&n);--L;
for (int i=0;i<n;L-=2*d[i++]) scanf("%d",&d[i]);
sort(d,d+n,greater<int>());
memset(dp,0,sizeof(dp));
dp[0][1][0]=1;
for (int i=0;i<n;++i)
for (int j=1;j<=n-i&&j<=i+1;++j)
for (int k=0;k<=(i-j+1)*40;++k)if (dp[i][j][k]){
(dp[i+1][j-1][k+2*d[i]]+=(ll)dp[i][j][k]*j%P)%=P;
(dp[i+1][j][k+d[i]]+=(ll)dp[i][j][k]*j*2%P)%=P;
(dp[i+1][j+1][k]+=(ll)dp[i][j][k]*j%P)%=P;
}
for (int i=fact[0]=1;i<=L+(n+2)*40;++i) fact[i]=(ll)fact[i-1]*i%P;
for (int i=0;i<=L+(n+2)*40;++i) inv[i]=fast_pow(fact[i],P-2);
int ans=0;
for (int i=max(-L,0);i<=(n+1)*40;++i) (ans+=(ll)dp[n][0][i]*c(L+i+n,L+i)%P)%=P;
printf("%d\n",ans);
return 0;
}

  

bzoj4498: 魔法的碰撞的更多相关文章

  1. CSS动效集锦,视觉魔法的碰撞与融合(二)

    引言 长久以来,我认识到.CSS,是存在极限的.正如曾经替你扛下一切的那个男人,也总有他眼含热泪地拼上一切,却也无法帮你做到的事情,他只能困窘地让你看到他的无能为力,怅然若失. 然后和曾经他成长的时代 ...

  2. CSS特效集锦:视觉魔法的碰撞与融合(二)

    引言 长久以来,我认识到.CSS,是存在极限的.正如曾经替你扛下一切的那个男人,也总有他眼含热泪地拼上一切,却也无法帮你做到的事情,他只能困窘地让你看到他的无能为力,怅然若失. 然后和曾经他成长的时代 ...

  3. CSS动效集锦,视觉魔法的碰撞与融合(一)

    前言 在本文中我讲述了7种CSS的动效,它们也许看起来并不惊艳,但是我认为却足够传达本文的理念:编写一些特殊的CSS样式的时候需要不拘于常理,要用特殊的认识角度看待标签和样式属性,从而用「绕个弯」的方 ...

  4. CSS动效集锦,视觉魔法的碰撞与融合(三)

    本文讲述的原理和相关demo 扇形DIV的使用——实现雷达扫描图 DIV环形布局—实现loading圈 动画的向量合成—实现抛物线动画 无限滚动动画—实现跑马灯效果 perspective和trans ...

  5. bzoj4664: Count

    是bzoj4498: 魔法的碰撞的哥哥题,我只写了一种 不一样的地方在于贡献有负数,第三维要保存的不能仅仅是0~L,这样空间会炸裂 考虑如何把贡献变成正的 假如要求最优解,那么一定是按顺序排,混乱度为 ...

  6. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  7. NavMesh系统动态碰撞的探讨

    Unity3D提供的NavMesh系统可以方便的解决游戏的寻路问题,但是该系统有一个比较让人不理解的问题: NavMesh导航时会忽略Physics系统本身的碰撞,也就是说NavMeshAgent在移 ...

  8. 邓布利多拍了拍你,并递来一份CSS魔法

    校长:阿不思·邓布bai利多 亲爱的少年:我们愉快地通知您,您已获准在CSS魔法学校就读.特此带给你一份CSS魔法秘籍,代码简单,支持个性化定制.学期定于今日开始,我们将在此静候您的猫头鹰带来您的回信 ...

  9. nw.js桌面软件开发系列 第0.1节 HTML5和桌面软件开发的碰撞

    第0.1节 HTML5和桌面软件开发的碰撞 当我们谈论桌面软件开发技术的时候,你会想到什么?如果不对技术本身进行更为深入的探讨,在我的世界里,有这么多技术概念可以被罗列出来(请原谅我本质上是一个Win ...

随机推荐

  1. python-list tuple dict set

    1:删除一个列表末尾的元素 pop方法 >>> a [1, 'Jack', 2, 3, 2] >>> a.pop() >>> a [1, 'Jac ...

  2. HSDB - HotSpot debugger

    HSDB 是专门用于调试 HotSpot VM 的调试器,它是一个图形化界面.与之对应的还有个 CLHSDB-Command Line HotSpot Debugger,命令行调试界面.下面是启动命令 ...

  3. fillStyle径向渐变

    <!DOCTYPE HTML> <head> <meta charset = "utf-8"> <title>canvas</ ...

  4. SqlServer-- NULL空值处理

    数据库中,一个列如果没有指定值,那么值就为null,数据库中的null表示"不知道",而不是表示没有.因此select null+1结果是null,因为"不知道" ...

  5. python 常用模块之os、sys、shutil

    目录: 1.os 2.sys 3.shutil 一.os模块 说明:os模块是对操作系统进行调用的接口 os.getcwd() #获取当前工作目录,即当前python脚本工作的目录路径 os.chdi ...

  6. C++基础——函数指针 函数指针数组

    ==================================声明================================== 本文版权归作者所有. 本文原创,转载必须在正文中显要地注明 ...

  7. css div中内容绝对居中(多行内容)

    div中的内容绝对居中(不适合IE6哦,IE6我已经不考虑了),直接看代码吧. <!DOCTYPE HTML> <html> <head> <title> ...

  8. 原生js与jquery操作iframe

    1  原生js获取iframe的window对象 //方法1 document.getElementById('iframeId').contentWindow; //方法2 window.frame ...

  9. Javascript 中的严格模式

    原文:http://www.ruanyifeng.com/blog/2013/01/javascript_strict_mode.html 一.概述 除了正常运行模式,ECMAscript 5添加了第 ...

  10. Silicon Labs电视调谐器 si2151

    随着数字电视与数模混合电视在全球范围内的逐步普及,人们对于电视机的功能要求也随之不断攀升,进而对整个电视芯片行业造成了在价格与功耗等方面的强烈冲击. 而中国作为连续四年取得全球电视出货量第一的“电视大 ...