首页 > 其他分享 >[lnsyoj1801/luoguP2051/AHOI2009] 中国象棋

[lnsyoj1801/luoguP2051/AHOI2009] 中国象棋

时间:2024-11-09 17:46:35浏览次数:1  
标签:中国象棋 +& AHOI2009 lnsyoj1801 nonumber cdot int 棋子 mod

题意

在 \(n \times m\) 大小的棋盘上放无标号棋子,使得任何一行或一列都不多于 \(2\) 个棋子,求方案数

sol

计数题,优先考虑 dp。
由于每行每列棋子不多于两个,所以我们可以计 \(f_{i,j,k}\) 表示前 \(i\) 行中,\(j\) 列恰好 \(1\) 个棋子,\(k\) 列恰好 \(2\) 个棋子的方案数。
状态转移也就出来了,比较繁琐,需要细推,注意取模

\[\begin{align} f_{i,j,k} =& f_{i-1,j,k} \nonumber \\ +& f_{i-1,j-1,k} \cdot [m-(j-1)-k] \nonumber \\ +& f_{i-1,j+1,k-1} \cdot (j+1) \nonumber \\ +& f_{i-1,j-2,k} \cdot \frac{[m-(j-2)-k]\cdot [m-(j-2)-k-1]}{2} \nonumber \\ +& f_{i-1,j+2,k-2} \cdot \frac{(j+2)\cdot(j+2-1)}{2} \nonumber \\ +& f_{i-1,j,k-2} \cdot [m-j-(k-1)]\cdot j \nonumber \end{align} \]

代码

#include <iostream>
#include <algorithm>
#include <cstring>

using namespace std;
typedef long long LL;

const int N = 105, mod = 9999973, INV2 = 4999987;

int f[N][N][N];
int n, m;

int main(){
    scanf("%d%d", &n, &m);
    f[0][0][0] = 1;
    for (int i = 1; i <= n; i ++ ) {
        for (int j = 0; j <= m; j ++ ) {
            for (int k = 0; k <= m - j; k ++ ) {
                f[i][j][k] = f[i - 1][j][k];
                if (j >= 1) f[i][j][k] = (f[i][j][k] + f[i - 1][j - 1][k] * (m - (j - 1) - k) % mod) % mod;
                if (k >= 1) f[i][j][k] = (f[i][j][k] + f[i - 1][j + 1][k - 1] * (j + 1) % mod) % mod;
                if (j >= 2) f[i][j][k] = (f[i][j][k] + (LL) f[i - 1][j - 2][k] * (m - (j - 2) - k) % mod * (m - (j - 2) - k - 1) % mod * INV2 % mod) % mod;
                if (k >= 2) f[i][j][k] = (f[i][j][k] + (LL) f[i - 1][j + 2][k - 2] * (j + 2) % mod * (j + 2 - 1) % mod * INV2 % mod) % mod;
                if (k >= 1) f[i][j][k] = (f[i][j][k] + f[i - 1][j][k - 1] * (m - j - (k - 1)) % mod * j % mod) % mod;
            }
        }
    }

    int ans = 0;
    for (int i = 0; i <= m; i ++ )
        for (int j = 0; j <= m - i; j ++ )
            ans = (ans + f[n][i][j]) % mod;
    
    printf("%d\n", ans);

    return 0;
}

标签:中国象棋,+&,AHOI2009,lnsyoj1801,nonumber,cdot,int,棋子,mod
From: https://www.cnblogs.com/XiaoJuRuoUP/p/-/lnsyoj1801_luoguP2051

相关文章

  • P2051 [AHOI2009] 中国象棋 题解
    DP好题?首先确定,每一行/列只能放至多两个棋子,这么少,所以我们的状态肯定和棋子数有关。由于我们不关注具体的方案数,所以我们不妨只关心对应棋子数量的行/列的数量。同时,由于考虑行和列都是一样的,所以我们不妨用行递推。所以我们设$\dp_{i,j,k}\$表示当前放到第\(i\)行,有\(......
  • canvas版本中国象棋,象棋的棋子控制还是复杂一些
    代码:<!Doctypehtml><htmllang="zh_cn"><head><metahttp-equiv="Content-Type"content="text/html;charset=utf-8"/><title>中国象棋</title><metaname="Key......
  • P4126 [AHOI2009] 最小割 题解
    DescriptionA,B两个国家正在交战,其中A国的物资运输网中有\(N\)个中转站,\(M\)条单向道路。设其中第\(i\(1\leqi\leqM)\)条道路连接了\(u_i,v_i\)两个中转站,那么中转站\(u_i\)可以通过该道路到达\(v_i\)中转站,如果切断这条道路,需要代价\(c_i\)。现在B国想找出一个......
  • Luogu P5005 中国象棋 - 摆上马 / Luogu P8756 国际象棋 题解 [ 蓝 ] [ 状压 dp ] [
    国际象棋:模板棋盘状压。摆上马:需要点思维的棋盘状压,相比上一道题加了“蹩马脚”的设定。Easy_version:国际象棋概述一下此类棋盘问题的思路:用二进制数表示出棋盘上某一行的状态。用位运算预处理出合法的单行状态,以及需要用到的一些东西。用位运算判断前一行或者前几行能否......
  • 打卡信奥刷题(313)用Scratch图形化工具信奥P2165[普及组/提高] [AHOI2009] 飞行棋
    [AHOI2009]飞行棋题目描述给出圆周上的若干个点,已知点与点之间的弧长,其值均为正整数,并依圆周顺序排列。请找出这些点中有没有可以围成矩形的,并希望在最短时间内找出所有不重复矩形。输入格式第一行为正整数N......
  • hnust 1497: 中国象棋中的跳马问题
    hnust1497:中国象棋中的跳马问题题目描述现在棋盘的大小不一定,由p,q给出,并且在棋盘中将出现障碍物(限制马的行动,与象棋走法相同)输入第一行输入n表示有n组测试数据。每组测试数据第一行输入2个整数p,q,表示棋盘的大小(1<=p,q<=100)。每组测试数据第二行输入4个整数,表示......
  • 基于QT和C++实现的中国象棋
    一,源码board.h#ifndefBOARD_H#defineBOARD_H#include<QWidget>#include"Stone.h"classBoard:publicQWidget{Q_OBJECTpublic:explicitBoard(QWidget*parent=0);bool_bRedTurn;//红方先走int_currentPlayer;//当前玩......
  • JavaScript妙笔生花:打造沉浸式中国象棋游戏体验
    前言随着信息技术的飞速发展,Web开发领域也出现了翻天覆地的变化。JavaScript作为前端开发中不可或缺的编程语言,其重要性不言而喻。而当我们谈论到利用JavaScript打造一款沉浸式的中国象棋游戏体验时,我们不仅仅是在开发一个游戏,更是在进行一种文化的传承和创新。以下将探讨......
  • [lnsyoj281/luoguP2023/AHOI2009]维护序列
    题意原题链接给定序列\(a\),要求维护区间加,区间乘,区间查询三种操作sol显然线段树,事实上,这是一道板子题(luoguP3373),但由于蒟蒻实在是太蒻了,并没有打过这道题。区间加如果我们将区间里的每一个元素都插入线段树做一次修改操作,那么一次修改操作的时间复杂度为\(O(n\logn)\),此时......
  • 基于C语言中国象棋项目的二次开发
    这是一个由C语言所编写的中国象棋项目,以下给出原项目的链接、代码、运行截图。原项目链接:https://blog.csdn.net/weixin_45590872/article/details/109308798原C语言代码如下:点击查看代码#include<stdio.h>#include<conio.h>#include<string.h>#include<stdlib.h>#includ......