#1124 : 好矩阵

描述

给定n, m。一个n × m矩阵是好矩阵当且仅当它的每个位置都是非负整数,且每行每列的和 ≤ 2。求好矩阵的个数,模109 + 7

输入

第一行一个整数T,表示测试点个数。下面T个测试点。每个测试点一行,包含两个整数n,m。1 ≤ T ≤ 104. 1 ≤ n, m ≤ 100.

输出

T行。每行是对应测试点的答案。

样例输入

1
2 2

样例输出

26

应该算是比较常规的DP题,有点卡时。

#include<cstdio>
#include<cctype>
#include<queue>
#include<cmath>
#include<cstring>
#include<algorithm>
#define rep(i,s,t) for(int i=s;i<=t;i++)
#define dwn(i,s,t) for(int i=s;i>=t;i--)
#define ren for(int i=first[x];i!=-1;i=next[i])
using namespace std;
inline int read() {
    int x=0,f=1;char c=getchar();
    for(;!isdigit(c);c=getchar()) if(c==‘-‘) f=-1;
    for(;isdigit(c);c=getchar()) x=x*10+c-‘0‘;
    return x*f;
}
const int maxn=110;
const int mod=1000000007;
typedef long long ll;
ll f[maxn][maxn][maxn],g[maxn][maxn][maxn],ans[maxn][maxn];
//前若干行,现在共有i列和为0,j列和为1,k列和为2的方案数
int main() {
    rep(i,0,100) f[i][0][0]=1;
    rep(n,1,100) {
        rep(i,0,100) rep(j,0,100-i) rep(k,0,100-i-j) g[i][j][k]=f[i][j][k],f[i][j][k]=0;
        rep(i,0,100) rep(j,0,100-i) rep(k,0,100-i-j) if(g[i][j][k]) {
            ll res=g[i][j][k];
            f[i][j][k]+=res;//without putting

            if(i>=1) f[i-1][j+1][k]+=res*i;//put a 1
            if(j>=1) f[i][j-1][k+1]+=res*j;

            if(i>=1&&j>=1) f[i-1][j][k+1]+=res*i*j;//put double 1
            if(i>=2) f[i-2][j+2][k]+=res*i*(i-1)/2;
            if(j>=2) f[i][j-2][k+2]+=res*j*(j-1)/2;

            if(i>=1) f[i-1][j][k+1]+=res*i;//put a 2
        }
        rep(i,0,100) rep(j,0,100-i) rep(k,0,100-i-j) {
            f[i][j][k]%=mod;
            (ans[n][i+j+k]+=f[i][j][k])%=mod;
        }
    }
    int T=read();
    while(T--) {
        int n=read(),m=read();
        printf("%lld\n",ans[n][m]);
    }
    return 0;
}

时间: 2024-10-05 17:16:20

#1124 : 好矩阵的相关文章

hihocoder 1124 : 好矩阵 dp

好矩阵 时间限制:3000ms 单点时限:1000ms 内存限制:256MB 描述 给定n, m.一个n?×?m矩阵是好矩阵当且仅当它的每个位置都是非负整数,且每行每列的和?≤?2.求好矩阵的个数,模109?+?7 输入 第一行一个整数T,表示测试点个数.下面T个测试点.每个测试点一行,包含两个整数n,m.1?≤?T?≤?104. 1?≤?n,?m?≤?100. 输出 T行.每行是对应测试点的答案. 样例输入 1 2 2 样例输出 26 题意很简单,由于,数量很大,如果考虑一个一个方格的放,要考

SDUT OJ 1124 飞越原野 (三维BFS练习)

飞跃原野 Time Limit: 5000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 勇敢的法里奥出色的完成了任务之后,正在迅速地向自己的基地撤退.但由于后面有着一大群追兵,所以法里奥要尽快地返回基地,否则就会被敌人逮住. 终于,法里奥来到了最后的一站:泰拉希尔原野,穿过这里就可以回到基地了.然而,敌人依然紧追不舍.不过,泰拉希尔的地理条件对法里奥十分有利,众多的湖泊随处分布.敌人需要绕道而行,但法里奥还是决定找一条能尽快回到基地的路. 假设泰拉希尔原野

矩阵乘法的Strassen算法详解

题目描述 请编程实现矩阵乘法,并考虑当矩阵规模较大时的优化方法. 思路分析 根据wikipedia上的介绍:两个矩阵的乘法仅当第一个矩阵B的列数和另一个矩阵A的行数相等时才能定义.如A是m×n矩阵和B是n×p矩阵,它们的乘积AB是一个m×p矩阵,它的一个元素其中 1 ≤ i ≤ m, 1 ≤ j ≤ p. 值得一提的是,矩阵乘法满足结合律和分配率,但并不满足交换律,如下图所示的这个例子,两个矩阵交换相乘后,结果变了: 下面咱们来具体解决这个矩阵相乘的问题. 解法一.暴力解法 其实,通过前面的分析

*C#(WPF)--矩阵拖动和矩阵动画(拖动展开,不足动画效果)

最近在研发新的项目,遇到了一个桌面模式下的难点--展开动画.之前动画这方面没做过,也许很多人开始做的时候也会遇到相关问题,因此我把几个重点及实际效果图总结展示出来: 我的开发环境是在VS2017下进行的,这个工具条主要功能是:一个工具条,可进行拖拉.可进行拖拉展开,可在拖动之后不足展开并反向继续展开剩下的部分: 一.[拖动]   拖动的核心代码是通过矩阵进行定位和拖动的,定位是以父容器为模板的.以下是核心代码(及效果图): 1 /// <summary> 2 /// 这里TitleBar代指最

矩阵快速幂刷题系列

来源自http://blog.csdn.net/chenguolinblog/article/details/10309423 hdu 1575 Tr A Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 5587    Accepted Submission(s): 4200 Problem Description A为一个方阵,则Tr

51nod 1137 矩阵乘法

基本的矩阵乘法 中间for(int j=0;i<n;i++)  //这里写错了   应该是j<n 晚上果然  效率不行 等会早点儿睡 //矩阵乘法 就是 两个矩阵 第一个矩阵的列 等与 第二个矩阵的行相同 // 然后ans[i][j] += a[i][k] * b[k][j]; #include<bits/stdc++.h> using namespace std; typedef long long ll; const int maxn = 150; int n; ll a[ma

2017中国大学生程序设计竞赛 - 网络选拔赛 HDU 6155 Subsequence Count 矩阵快速幂

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6155 题意: 题解来自:http://www.cnblogs.com/iRedBean/p/7398272.html 先考虑dp求01串的不同子序列的个数. dp[i][j]表示用前i个字符组成的以j为结尾的01串个数. 如果第i个字符为0,则dp[i][0] = dp[i-1][1] + dp[i-1][0] + 1,dp[i][1] = dp[i-1][1] 如果第i个字符为1,则dp[i][1

POJ3233 构造子矩阵+矩阵快速幂

题意:给你矩阵A,求S=A+A^1+A^2+...+A^n sol:直接把每一项解出来显然是不行的,也没必要. 我们可以YY一个矩阵: 其中1表示单位矩阵 然后容易得到: 可以看出这个分块矩阵的左下角那块就可以得到要求的解S 我们取这一块,再减去一个单位矩阵1即可. 为了保持右下角一直是1,所以右上的位置必须是0,由于需要不断移位,所以1是必要的,A是必要的,所以第一列保证移位, 第二列保证保留1,因此我们能成功构造出.... 这个题还可以根据等比矩阵的性质来进行求解...后面补(x

矩阵乘法

矩阵加法就是相同位置的数字加一下,矩阵减法也类似 矩阵乘以一个常数,就是所有位置都乘以这个数 矩阵乘以矩阵 计算规则是,第一个矩阵第一行的每个数字(2和1),各自乘以第二个矩阵第一列对应位置的数字(1和1),然后将乘积相加( 2 x 1 + 1 x 1),得到结果矩阵左上角的那个值3 矩阵的本质就是线性方程式,两者是一一对应关系.如果从线性方程式的角度,理解矩阵乘法就毫无难度.下面是一组线性方程式 矩阵的最初目的,只是为线性方程组提供一个简写形式 下面是严格的证明.有三组未知数 x.y 和 t,