[NOIP2019模拟赛]HC1147 时空阵
题目描述:
幽香这几天学习了魔法,准备建造一个大型的时空传送阵。
幽香现在可以在幻想乡的n个地点建造一些传送门,如果她建造了从地点a与地点b之间的传送门,那么从a到b和从b到a都只需要单位1的时间。
同时这些地点之间在地理上是非常遥远的,因此来往他们必须使用传送门。
现在幽香想要问你,有多少种建造传送门的方案,使得地点1和地点n之间的最短距离恰好为k?两个方案不同当且仅当建造的传送门的集合不同。不能建造节点到自身的传送门,两个点之间也最多造一个传送门。
分析:
DP...
然而考场上没时间了,只打了20pts(k==1)
为了防止变量名冲突,题面中的k在代码中都用m代替!!!
首先:显然这道题的合法路径是一层一层的节点组成的
然后就可以DP了(话说考场上状态设计都设计出来了,转移没时间了...)
设f[i][j][k]表示当前进行到第i层,总共使用了j个节点,第i层使用了k个节点
显然这个可以有f[i-1][j-k][s]转移过来,我们只要枚举s就可以了,现在我们只要计算f[i-1][j-k][s]的系数就好了
分类讨论:
当i<m时:
①可以当前层内部连边,也就是$2^{C_k^2}$种可能
②当前层与上一层连边,且当前层的所有点至少有一条边连出去,也就是$(\sum\limits_{p=1}^{s}C_s^p-1)^k$
tip:上式子用二项式定理可以化简为$(2^{s}-1)^k$
③注意到当前这k个点是从剩下的n-j+k-1(最后减一是因为第n个点必须放在第m层)所以从这里面选k个点,方案数为$C_{n-j+k-1}^k$
综上:$$f[i][j][s]=\sum f[i-1][j-k][s]*(2^s-1)^k*C_{n-j+k-1}^k*C_k^2$$
当i==m时
注意到只有第③个条件需要改变,也就是说第n个点肯定在这一层,所以只要在n-j+k-1中选择k-1的点即可,方案数为$C_{n-j+k-1}^{k-1}$
即:$$f[i][j][s]=\sum f[i-1][j-k][s]*(2^s-1)^k*C_{n-j+k-1}^{k-1}*C_k^2$$
预处理一下组合数,及时取模,结合快速幂就好了
#include<bits/stdc++.h>
#define int long long
using namespace std;
inline int read(){
int ans=,f=;char chr=getchar();
while(!isdigit(chr)){if(chr=='-')f=-;chr=getchar();}
while(isdigit(chr)) {ans=(ans<<)+(ans<<)+chr-;chr=getchar();}
return ans*f;
}const int P = 1e9+;
int n,m,f[][][],ans,cc[][];
int ksm(int x,int p){
int ans=;
for(;p;p>>=,x=x*x%P) if(p&) ans=ans*x%P;
return ans;
}
int C(int x,int y){
int mul=;
for(int i=;i<=y;i++) mul=mul*i%P;
for(int i=;i<=x-y;i++) mul=mul*i%P;
int t=ksm(mul,P-);
mul=;
for(int i=;i<=x;i++) mul=mul*i%P;
mul=mul*t%P;
}
inline void Add(int &x,int y){x=x+y;if(x>=P)x-=P;}
inline void Solve(){
f[][][]=;
for(int i=;i<=m;++i)
for(int j=;j<=n;++j)
for(int k=;k<=j;k++){
for(int s=;s<=j-k;s++)
if(i<m)//第一种
Add(f[i][j][k],f[i-][j-k][s]*ksm(,(k-)*k/)%P*cc[n-j+k-][k]%P*ksm(ksm(,s)-,k)%P);
else//第二种
Add(f[i][j][k],f[i-][j-k][s]*ksm(,(k-)*k/)%P*cc[n-j+k-][k-]%P*ksm(ksm(,s)-,k)%P);
}
for(int i=m+;i<=n;i++)
for(int j=;j<=n;j++)
Add(ans,f[m][i][j]*ksm(,(n-i)*(n-i-)/+j*(n-i)%P)%P);
cout<<ans<<endl;
}
signed main(){
freopen("timegate.in","r",stdin);
freopen("timegate.out","w",stdout);
for(int i=;i<=;i++)for(int j=;j<=i;j++)cc[i][j]=C(i,j);//预处理组合数
n=read(),m=read();
Solve();
return ;
}
[NOIP2019模拟赛]HC1147 时空阵的更多相关文章
- test20190827 NOIP2019 模拟赛
100+100+50=250.最后那道期望题需要用另外的方式统计. 精灵加护 ljss 被 M 个敌人打倒在地上啦!每个敌人有一个威力值 bi.但是他手中还拥有 N 把武器!每把武器有一个威力值 ai ...
- test20190826 NOIP2019 模拟赛
100+100+40=240.我觉得如果没做过第三题考场上却能想出来的都是神仙. 基因突变 [问题描述] 邪恶的 707 刚刚从白垩纪穿越回来,心中产生了一个念头:我要统治人类! 但是统治人类是很庞大 ...
- test20190818 NOIP2019 模拟赛
0+0+20=20,不给大样例,小数据又水,还没有题解的垃圾题. A 题 问题描述: long long ago, Lxhgww 统治的国家里有 n 个城市,其中某一个城市是 capital (首都) ...
- test20190816 NOIP2019 模拟赛
100+100+20=220,T3吐槽:整个考室没有一个人正确地理解了题意. 树上路径(phantasm) Akari 的学校的校门前生长着一排 n 棵树,从西向东依次编号为 1 ∼ n.相邻两棵树间 ...
- 题解 noip2019模拟赛Day1T3
题面 运河计划 问题描述 水运在人类的交通运输史中一直扮演着重要的角色.借助河流.的便利,人们得以把大量的货物输送到天南海北不仅仅是自然界现成的河流,人工开凿的运河(如苏伊士运河.巴拿马运河.我国的京 ...
- [NOIP2019模拟赛]LuoguP4261白金元首与克劳德斯
题目描述 给出坐标系中n个矩形,类型1的矩形每单位时间向x轴正方向移动1个单位,类型2的矩形向y轴正方向,初始矩形不重叠,一个点被矩形覆盖当且仅当它在矩形内部(不含边界),求$(-\infty ,+\ ...
- [NOIP2019模拟赛][AT2381] Nuske vs Phantom Thnook
题目链接 评测姬好快啊(港记号?)暴力40pts变成60pts 因为题目说了保证蓝色点两两之间只有一条路径,所以肯定组成了一棵树,而对于每次询问的x1,y1,x2,y2的子矩阵中就存在着一个森林 不难 ...
- [NOIP2019模拟赛]数数(gcd)
题目大意: 求l~r中有多少数与x互质,带单点修改 分析: 两个30的部分分很好打: ·n<=1000暴力O(nq)就好了 ·$a_i<=100$用树状数组维护每个x的前缀和就好了 100 ...
- [NOIP2019模拟赛]序列(Sequence)
题目大意 有一个序列$A_i$ • 对于 i ≥ 1,如果有$ A_i > 0.A_{i+1}> 0$ 且存在 $A_{i+2}$,那么法老可以令$ Ai$ 和 $A_{i+1}$ 减一, ...
随机推荐
- NX二次开发-获取切换按钮的当前状态UF_MB_ask_toggle_state
NX9+VS2012 1.打开D:\Program Files\Siemens\NX 9.0\UGII\menus\ug_main.men 找到装配和PMI,在中间加上一段 TOGGLE_BUTTON ...
- Centos6.5安装mysql5.7.19
一.安装前准备 安装采用二进制包方式,软件包5.7.19版本下载地址:https://dev.mysql.com/downloads/mysql/ 选择MYSQL Community Server版本 ...
- HTTPS客户端的java实现
目录 https客户端 指定ssl算法套 浏览器可以作为客户端向服务器发送Http请求,当需要访问后台或第三方Restful接口时,也可以用java实现客户端直接发get/post请求,获取数据. h ...
- 用solr DIH 实现mysql 数据定时,增量同步到solr
基础环境: (二)设置增量导入为定时执行的任务: 很多人利用Windows计划任务,或者Linux的Cron来定期访问增量导入的连接来完成定时增量导入的功能,这其实也是可以的,而且应该没什么问题. 但 ...
- 46张PPT弄懂JVM、GC算法和性能调优!
来源:cnblogs.com/cyfonly/p/5807121.html 本PPT从JVM体系结构概述.GC算法.Hotspot内存管理.Hotspot垃圾回收器.调优和监控工具六大方面进行讲述. ...
- Harry and magic string HDU - 5157 记录不相交的回文串对数
题意: 记录不相交的回文串对数 题解: 正着反着都来一遍回文树 用sum1[i] 表示到 i 位置,出现的回文串个数的前缀和 sun2[i]表示反着的个数 ans+=sum1[i-1]*sum2[i] ...
- SQLAlchemy连接数据库创建表
# 连接数据库,创建表 def create_all(): engine = create_engine( 'mysql+pymysql://root:123456@127.0.0.1:3306/sq ...
- 【笔记篇】斜率优化dp(一) HNOI2008玩具装箱
斜率优化dp 本来想直接肝这玩意的结果还是被忽悠着做了两道数论 现在整天浑浑噩噩无心学习甚至都不是太想颓废是不是药丸的表现 各位要知道我就是故意要打删除线并不是因为排版错乱 反正就是一个del标签嘛并 ...
- splice用法
splice()方法给数组添加内容,返回新的数组 splice()方法替换数组一项内容,返回新的数组 如果添加进数组的元素个数不等于被删除的元素个数,数组的长度会发生相应的改变. 比如:从第 2 位开 ...
- java多线程-AbstractQueuedSynchronizer
大纲: AbstractQueuedSynchronizer简介 aqs基本结构 aqs应用-ReentrantLock.lock aqs应用-ReentrantLock.unlock aqs应用-S ...