列表

详情


NC19885. [AHOI2009]CHESS 中国象棋

描述

在N行M列的棋盘上,放若干个炮可以是0个,使得没有任何一个炮可以攻击另一个炮。 请问有多少种放置方法,中国像棋中炮的行走方式大家应该很清楚吧.一个炮要能攻击另一个炮他们必须要处于同一行或者一列且他们之间有且仅有一个棋子.

输入描述

一行包含两个整数N,M,中间用空格分开.

输出描述

输出所有的方案数,由于值比较大,输出其mod 9999973

示例1

输入:

1 3

输出:

7

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++ 解法, 执行用时: 18ms, 内存消耗: 6776K, 提交时间: 2021-06-16 20:48:00

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod=9999973;
ll dp[105][105][105];
int n,m;

ll dfs(ll cur,ll u,ll v,ll w){
	if(cur==n+1) return 1;
	if(dp[cur][u][v]) return dp[cur][u][v];
	ll ans=dfs(cur+1,u,v,w)%mod;
	if(u>0) ans+=dfs(cur+1,u-1,v+1,w)%mod*u%mod;
	if(v>0) ans+=dfs(cur+1,u,v-1,w+1)%mod*v%mod;
	if(u>0&&v>0) ans+=dfs(cur+1,u-1,v,w+1)%mod*u*v%mod;
	if(u>1) ans+=dfs(cur+1,u-2,v+2,w)%mod*u*(u-1)/2%mod;
	if(v>1) ans+=dfs(cur+1,u,v-2,w+2)%mod*v*(v-1)/2%mod;
	dp[cur][u][v]=ans%mod;
	return dp[cur][u][v]; 
}

int main(){
	cin>>n>>m;
	cout<<dfs(1,m,0,0)%mod;
}

上一题