空间漫游(SAC大佬的测试)
题目描述
由于球哥和巨佬嘉诚交了很多保护费,我们有钱进行一次 d 维空间漫游。
d 维空间中有 d 个正交坐标轴,可以用这些坐标轴来描述你在空间中的位置和移动的方
向。例如,d = 1 时,空间是一个数轴,方向有左或右;d = 2 时,空间是一个平面,方向为
上下左右之一;d = 3 时,空间是一个三维空间,方向为上下左右前后之一;d≥4 时同理。
形式化地描述,d 维空间中共有 2d 个方向,分别对应平行于 d 个坐标轴的正方向和负
方向。虽然这 2d 个方向可以线性组合出无限个方向,但这不在本题的讨论范围中。可以用
一个 d 维向量来描述一个 d 维空间中的方向,其中一维是 1 或-1,其余维度均为 0。如,d=4
时,几个可能的方向是(0,1,0,0)、(0,0,-1,0)等,而(1,1,0,0)不是一个本题中讨论的方向。
你在开始漫游之前,要为自己制定一条路线。你打算一共走 2N 步,每步选择 2d 个方
向中的一个,并沿着该方向走 1 单位长度的距离。并且,你希望漫游结束后能回到开始时的
起点。
请计算有多少条不同的路线满足上述要求,并输出其 mod 1,000,000,007 的值。两条路
线被认为不同当且仅当存在一步,两条路线在该步选择的方向不同。
输入格式
输入仅一行,两个用空格分开的非负整数 d,N。
输出格式
输出仅一行,仅一个整数表示符合要求的路线条数 mod 1,000,000,007。
样例输入 1
2 0
样例输出 1
1
样例解释 1
长度为 0 的路线只有一条
样例输入 2
2 1
样例输出 2
4
样例解释 2
路线 1:(1,0), (-1,0)
路线 2:(-1,0), (1,0)
路线 3:(0,1), (0,-1)
路线 4:(0,-1), (0,1)
样例输入 3
3 2
样例输出 3
90
%%%SAC巨佬https://home.cnblogs.com/u/NaVi-Awson
5 分算法
对于 N = 0,显然路线只有一条,输出 1 即可,复杂度 O(1)。
20 分算法
结合 5 分算法,对于另外的 d = 1,我们可以用 f[i][j]表示第 i 步走到 j 这个位置的方
案数,f[i][j] = f[i-1][j-1]+f[i-1][j+1],因为会有负值,我们可以将整个数组向右平移,即
可求解。复杂度 O(N^2 )。
60 分算法
结合 20 分算法,并且由它启发,我们开三维的数组 f[i][x][y],第 i 步走到二位位置
坐标(x,y)方案数,由四个方向转移过来,复杂度 O(N^3 )。
100 分算法
我们发现到后面维度 d 适合 n 一个数量级的,显然我们不可以单独地把每一个维度拿
出来单独研究。
我们发现既然要求走到原点,那是不是就是在每个正交轴上的投影均为 0。就等于说我
在某一维度上向“外”走 m 步,就一定要走回来 m 步。
我们试着定义方程 f[i][j]表示在前 i 个维度向外走了 j 步(即总共走了 2*j 步)的方案数。
如何转移?我们正考虑当前的 i 维,我并不关心前 i-1 维是怎样走的,那是不是状态是
由 f[i-1][j-k],0<=k<=j 转移过来的。那么我肯定不能简单的相加。
考虑本质,f[i-1][j-k]表示从前 i-1 维向外走了 j-k 步,那么剩下的 k 步是要在这一维里面走的。
我要把 j-k 和 k 有机融合在一起。
我们想到了组合数。
C(2*k,2*j) 表示我们在这总共走的 2*j 步中选取 2*k 步为当前这一维走的。
那么对于 f[i][j-k],我们还要乘上一个 C (2*k,2*j)
但这还是不够,我们还没考虑这 2*k 步中是怎样走的。因为我们刚才说过了 2*k 步有向
“外”走的也有向“内”走的,那么还有乘一个 C(k,2*k) 。
综上转移方程就是
f[i][j]=sum{f[i-1][j-k]* C(k,2*k)*C(2*j,2*k)}
对于组合数用阶乘逆元
复杂度 O(d*N^2 )
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
typedef long long lol;
int Mod=;
lol A[],B[],f[][];
int d,n;
lol C(int x,int y)
{
if (x==||y==) return ;
lol fz=B[x];
lol fm=(A[y]*A[x-y])%Mod;
return (fz*fm)%Mod;
}
int main()
{int i,j,k;
cin>>d>>n;
A[]=;
A[]=;
for (i=;i<=*n;i++)
A[i]=((Mod-Mod/i)*A[Mod%i])%Mod;
for (i=;i<=*n;i++)
A[i]=(A[i]*A[i-])%Mod;
B[]=;
for (i=;i<=*n;i++)
B[i]=(B[i-]*i)%Mod;
f[][]=;
for (i=;i<=d;i++)
{
for (j=;j<=n;j++)
{
for (k=;k<=j;k++)
{
f[i][j]+=(f[i-][j-k]*C(*j,*k)%Mod)*C(*k,k)%Mod;
f[i][j]%=Mod;
}
}
}
cout<<f[d][n];
}
空间漫游(SAC大佬的测试)的更多相关文章
- Oracle12c:安装后新建用户及其默认表空间,并创建表测试
环境: 操作系统:Windows Server2008 R2 X64 Oracle版本:12c 如何安装? -- oracle 12c在oracle linux 6.6 x64上的安装 -- Wind ...
- 贼有意思[最长上升公共子序列](SAC大佬测试题)
题目描述Awson 最近越来越蠢了,一天就只知道 zyys.他定义了一个 zyys 数列:这个数列满足:1.是另外两个数列 A,B 的公共子序列;2.数列单调递增.现在他有一个问题,我们假设知道两个长 ...
- 手机APP测试的几大点
移动互联网App测试点包括: 1.安全测试: 安全测试包括: a.软件是否存在扣费风险,比如发送短信,拨打电话,连接网络等. b.软件是否存在泄漏用户隐私的风险,比如访问手机信息,访问联系人信息等. ...
- APP测试流程
1 APP测试基本流程 1.1流程图 1.2测试周期 测试周期可按项目的开发周期来确定测试时间,一般测试时间为两三周(即15个工作日),根据项目情况以及版本质量可适当缩短或延长测试时间.正式测试前先向 ...
- Oracle 10g bigfile表空间、smallfile 表空间
smallfile tablespace设置不同大小的db_block_size时数据文件允许的最大大小 db_block_size=2KB,2KB*4M=8192M 8Gdb_block_ ...
- Oracle安装过程物理内存检查及临时temp空间不足解决办法
物理内存 – 此先决条件将测试系统物理内存总量是否至少为 922MB (944128.0KB). 预期值 : N/A 实际值 : N/A 错误列表: – 可用物理内存 PRVF-7531 : 无法在节 ...
- 数据泵 TTS(传输表空间技术)
1.源库准备环境 --创建被传输的表空间create tablespace tts logging datafile '/home/oracle/app/oradata/orcl/tts01.dbf' ...
- jdk源码剖析五:JDK8-废弃永久代(PermGen)迎来元空间(Metaspace)
目录 1.背景 2.为什么废弃永久代(PermGen) 3.深入理解元空间(Metaspace) 4.总结 ========正文分割线===== 一.背景 1.1 永久代(PermGen)在哪里? 根 ...
- 移动应用/APP的测试流程及方法
1. APP测试基本流程 1.1流程图 1.2测试周期 测试周期可按项目的开发周期来确定测试时间,一般测试时间为两三周(即15个工作日),根据项目情况以及版本质量可适当缩短或延长测试时间.正式测试前先 ...
随机推荐
- beta冲刺6
前言:此篇是补昨天凌晨的.后面有更新但是太晚了就没有即使更新.所以现在过来更新一下. 昨天的未完成: 用户测试+测试报告 目前剩下的功能点:输入内容检测 我的社团输出显示格式调整. 今天的完成: 我的 ...
- 201421123042 《Java程序设计》第11周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多线程相关内容. 2. 书面作业 本次PTA作业题集多线程 1. 源代码阅读:多线程程序BounceThread 1.1 BallR ...
- java关于for循环。
众所周知,JAVA中for循环的基本格式为: for(初始化表达式:布尔表达式:循环后更新表达式){循环体} 举个例子来说可以写成 (1)for (int x=1;x<10;x++){ Syst ...
- Mysql必须知道的知识
最近在准备面试,所以也整理了一些Mysql数据库常用的知识,供大家参考. 1.MySQL的复制原理以及流程 (1).复制基本原理流程 1. 主:binlog线程--记录下所有改变了数据库数据的语句,放 ...
- VMware网络配置
NAT模式 首先保证虚拟机网卡和主机对接,虚拟机网络连接要和主机在同一网段 1. 控制面板\网络和 Internet\网络连接中配置VMnet8 2. 编辑虚拟机网络配置 此处子网ip需要和Vnet8 ...
- keycloak管理用户权限
一.在keycloak中定义基础数据 1.realm 如果多个模块使用不同的用户权限,就分realm 如果多个模块共用一套用户权限,就顶一个一个realm 2.每个模块是一个client-app 3. ...
- Linux入门:增加用户,并赋予权限
一.增加用户 1.增加用户,并指定主目录 # useradd –d /usr/sam -m sam此命令创建了一个用户sam,其中-d和-m选项用来为登录名sam产生一个主目录/usr/sam(/us ...
- EasyUI 冻结列
一.如果是js绘制的,设置frozenColumn属性就可以,frozenColumn 属性和 columns 属性都是设置列,frozenColumn是设置冻结列 $('#tt').datagrid ...
- C#微信公众号开发——access_token的获取
access_token是公众号的全局唯一票据,公众号调用各接口时都需使用access_token.正常情况下access_token有效期为7200秒,重复获取将导致上次获取的access_toke ...
- ArUco----一个微型现实增强库的介绍及视觉应用(一)
ArUco----一个微型现实增强库的介绍及视觉应用(一) 一.ArUco简介 ArUco是一个开源的微型的现实增强库,目前好像已经集成在OpenCV3.0以上的版本内了,它除了用于现实增强,还很用于 ...