zoukankan      html  css  js  c++  java
  • JZOJ【NOIP2013模拟联考14】隐藏指令

    JZOJ【NOIP2013模拟联考14】隐藏指令

    题目

    Description

    在d维欧几里得空间中,指令是一个长度为2N的串。串的每一个元素为d个正交基的方向及反方向之一。例如,d = 1时(数轴),串的每一个元素为左或右;d = 2时(平面),串的元素为上下左右之一;d = 3时(空间),串的元素为上下左右前后之一;d≥4时同理。
    从起点出发,结月缘按照顺序一个一个的执行指令S中的元素,对于每个元素,结月往该方向行走1步。图2是一个例子,d = 2, S =→↓↑→→↓→→,|S|=2N=8。
    在这里插入图片描述
    我们认为,指令S是能够变得幸福的,当且仅当结月执行完该指令S后能够回到出发点。
    请计算有多少种不同的指令S是能够变得幸福的,并输出其mod 1 000 000 007的值。两个指令被认为不同当且仅当存在一个位置,两个串在该处的元素不同。

    Input

    输入仅一行,两个用空格分开的非负整数d,N。

    Output

    输出仅一行,仅一个整数表示能够变得幸福的指令数mod 1 000 000 007。

    Sample Input

    输入1:
    2 0
    输入2:
    2 1
    输入3:
    2 2
    输入4:
    3 1
    输入5:
    3 2

    Sample Output

    输出1:
    1
    【样例1说明】
    空指令是能够变得幸福的。
    输出2:
    4
    【样例2说明】
    S1 =←→, S2 =→← , S3 =↑↓, S4 =↓↑
    输出3:
    36
    【样例3说明】
    如果结月缘只在一个维度上运动,也就是指令中横与纵的方向不同时出现,那么可能的情况有12种。如果结月缘在两个维度上都有运动,也就是指令中左右上下同时出现,那么有4! = 24种情况。相加后除以1 000 000 007取余数即可得到答案36。
    输出4:
    6
    【样例4说明】
    结月只能在三个维度之中一个运动,每个维度对应两种可能的能够变得幸福的隐藏指令。故总计3*2=6。
    输出5:
    90

    Data Constraint

    在这里插入图片描述

    题解

    题意

    有一个(d)维空间,同时有一个长度为(2n)的操作序列,每个操作往某一维的正方向或反方向走一格,问多少种方案使得最后走回原点,对(1e9+7)取模

    题解

    5%

    (n=0)时答案是1
    期望得分5

    30%

    (d=1)时答案是(C_{2n}^n)
    因为只有正方向和反方向各占一半才能走回原点
    综上,期望得分30

    60%

    (d=2)时答案是((C_{2n}^n)^2)
    证明如下
    在这里插入图片描述
    综上,期望得分60

    75%

    (d=3)时答案为
    (sum_{i=0}^nsum_{j=0}^{n-i}C_{2n}^{2i}C_{2n-2i}^{2j}C_{2i}^iC_{2j}^jC_{2n-2i-2j}^{n-i-j})
    证明同(d=2)
    综上,期望得分75

    100%

    考虑(dp)
    (f[i][j])表示当前到了第(i)维,放了(j)对正反方向
    转移
    (f[i][j]=sum_{k=0}^jf[i-1][j-k]*C_{2j}^{2k}*C_{2k}^k)
    (k)表示当前这一维要放几对正反
    预处理组合数即可

    Code

    #include<cstdio>
    #include<cstring>
    #define mod 1000000007
    using namespace std;
    int n,d,t[401];
    long long s,now,g[401][401],f[401][401];
    int main()
    {
    	scanf("%d%d",&d,&n);
    	if (n==0)
    	{
    		printf("1
    ");
    		return 0;	
    	} 
    	g[0][0]=1;
    	for (int i=1;i<=2*n;++i)
    		for (int j=0;j<=i;++j)
    			g[i][j]=(g[i-1][j-1]+g[i-1][j])%mod;
    	f[0][0]=1;
    	for (int i=1;i<=d;++i)
    		for (int j=0;j<=n;++j) 
    			for (int k=0;k<=j;++k)
    				f[i][j]=(f[i][j]+((f[i-1][j-k]*g[2*j][2*k]%mod)*g[2*k][k]%mod))%mod;
    	printf("%lld
    ",f[d][n]);
    	return 0;
    }
    
  • 相关阅读:
    如何封装一个Ajax函数
    了解Ajax及Ajax如何发送请求
    jQuery的animate动画方法及动画排队问题解决
    jQuery的几种显示隐藏方法
    冲鸭!电瓶车
    Qt中使用HTTPS
    空非空
    河西走廊
    “财富自由”者之殇
    说鞋
  • 原文地址:https://www.cnblogs.com/Livingston/p/13973684.html
Copyright © 2011-2022 走看看