【hihocoder [Offer收割]编程练习赛9 D】【简单DP】矩阵填数

2024-01-15 21:58

本文主要是介绍【hihocoder [Offer收割]编程练习赛9 D】【简单DP】矩阵填数,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目4 : 矩阵填数

时间限制: 10000ms
单点时限: 1000ms
内存限制: 256MB

描述

小Hi在玩一个游戏,他需要把1, 2, 3, ... NM填入一个N行M列的矩阵中,使得矩阵每一行从左到右、每一列从上到下都是递增的。  

例如如下是3x3的一种填法:

136  
247  
589

给定N和M,小Hi希望知道一共有多少种不同的填法。

输入

一行包含两个整数N和M。  

对于60%的数据 1 <= N <= 2, 1 <= M <= 100000  

对于20%的数据 N = 3, 1 <= M <= 100  

对于100%的数据 1 <= N <= 3, 1 <= M <= 100000

输出

输出一共有多少种不同的填法。由于结果可能很大,你只需输出答案模109+7的余数。

样例输入
3 2
样例输出
5

#include<stdio.h>
#include<iostream>
#include<string.h>
#include<string>
#include<ctype.h>
#include<math.h>
#include<set>
#include<map>
#include<vector>
#include<queue>
#include<bitset>
#include<algorithm>
#include<time.h>
using namespace std;
void fre() { freopen("c://test//input.in", "r", stdin); freopen("c://test//output.out", "w", stdout); }
#define MS(x, y) memset(x, y, sizeof(x))
#define ls o<<1
#define rs o<<1|1
typedef long long LL;
typedef unsigned long long UL;
typedef unsigned int UI;
template <class T1, class T2>inline void gmax(T1 &a, T2 b) { if (b > a)a = b; }
template <class T1, class T2>inline void gmin(T1 &a, T2 b) { if (b < a)a = b; }
const int N = 0, M = 0, Z = 1e9 + 7, inf = 0x3f3f3f3f;
template <class T1, class T2>inline void gadd(T1 &a, T2 b) { a = (a + b) % Z; }
int casenum, casei;
int n, m;
LL qpow(LL x, int p)
{LL y = 1;while (p){if (p & 1) y = y * x % Z;x = x * x % Z;p >>= 1;}return y;
}
int main()
{while(~scanf("%d%d", &n, &m)){LL ans = 1;for (int i = 2; i <= n * m; ++i)ans = ans * i % Z;for (int i = 1; i <= n; ++i){for (int j = 1; j <= m; ++j){ans = ans * qpow(i + j - 1, Z - 2) % Z;}}printf("%lld\n", ans);}return 0;
}
/*
【题意】
n * m个点放入矩阵使得行列有序【分析】
★这种思维模式很重要★
其实,我们发现,这题,不光最后形成的n * m的矩阵需要满足横增竖增的条件,其他的任何一个子矩阵也都要满足这个条件。
也就是说。我们在形成一个n * m矩阵的过程中,从细到巨,每一步也都要符合目标的限制条件。
这样做法就有了——
我们for循环形成i*j的矩阵,之前的
(i - 1) * (j - 1)、(i)*(j - 1)、(i - 1)*j 这三种类型的矩阵显然都是满足目标条件的。
那么其实我们只要调整使得(i, j)这个点也满足这个条件即可。
如何调整呢?
与(i, j)产生关系的是其上面的i - 1个点和其左边的j - 1个点
这一共i + j - 1个点中,我们要调整(i, j)为相对最大的,所以/=(i + j - 1)
这样全部扫描一遍。就AC啦!*/


这篇关于【hihocoder [Offer收割]编程练习赛9 D】【简单DP】矩阵填数的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/610340

相关文章

MySQL的JDBC编程详解

《MySQL的JDBC编程详解》:本文主要介绍MySQL的JDBC编程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录前言一、前置知识1. 引入依赖2. 认识 url二、JDBC 操作流程1. JDBC 的写操作2. JDBC 的读操作总结前言本文介绍了mysq

Python 基于http.server模块实现简单http服务的代码举例

《Python基于http.server模块实现简单http服务的代码举例》Pythonhttp.server模块通过继承BaseHTTPRequestHandler处理HTTP请求,使用Threa... 目录测试环境代码实现相关介绍模块简介类及相关函数简介参考链接测试环境win11专业版python

Python异步编程之await与asyncio基本用法详解

《Python异步编程之await与asyncio基本用法详解》在Python中,await和asyncio是异步编程的核心工具,用于高效处理I/O密集型任务(如网络请求、文件读写、数据库操作等),接... 目录一、核心概念二、使用场景三、基本用法1. 定义协程2. 运行协程3. 并发执行多个任务四、关键

AOP编程的基本概念与idea编辑器的配合体验过程

《AOP编程的基本概念与idea编辑器的配合体验过程》文章简要介绍了AOP基础概念,包括Before/Around通知、PointCut切入点、Advice通知体、JoinPoint连接点等,说明它们... 目录BeforeAroundAdvise — 通知PointCut — 切入点Acpect — 切面

python连接sqlite3简单用法完整例子

《python连接sqlite3简单用法完整例子》SQLite3是一个内置的Python模块,可以通过Python的标准库轻松地使用,无需进行额外安装和配置,:本文主要介绍python连接sqli... 目录1. 连接到数据库2. 创建游标对象3. 创建表4. 插入数据5. 查询数据6. 更新数据7. 删除

Jenkins的安装与简单配置过程

《Jenkins的安装与简单配置过程》本文简述Jenkins在CentOS7.3上安装流程,包括Java环境配置、RPM包安装、修改JENKINS_HOME路径及权限、启动服务、插件安装与系统管理设置... 目录www.chinasem.cnJenkins安装访问并配置JenkinsJenkins配置邮件通知

C#异步编程ConfigureAwait的使用小结

《C#异步编程ConfigureAwait的使用小结》本文介绍了异步编程在GUI和服务器端应用的优势,详细的介绍了async和await的关键作用,通过实例解析了在UI线程正确使用await.Conf... 异步编程是并发的一种形式,它有两大好处:对于面向终端用户的GUI程序,提高了响应能力对于服务器端应

C# async await 异步编程实现机制详解

《C#asyncawait异步编程实现机制详解》async/await是C#5.0引入的语法糖,它基于**状态机(StateMachine)**模式实现,将异步方法转换为编译器生成的状态机类,本... 目录一、async/await 异步编程实现机制1.1 核心概念1.2 编译器转换过程1.3 关键组件解析

Python yield与yield from的简单使用方式

《Pythonyield与yieldfrom的简单使用方式》生成器通过yield定义,可在处理I/O时暂停执行并返回部分结果,待其他任务完成后继续,yieldfrom用于将一个生成器的值传递给另一... 目录python yield与yield from的使用代码结构总结Python yield与yield

Java中使用 @Builder 注解的简单示例

《Java中使用@Builder注解的简单示例》@Builder简化构建但存在复杂性,需配合其他注解,导致可变性、抽象类型处理难题,链式编程非最佳实践,适合长期对象,避免与@Data混用,改用@G... 目录一、案例二、不足之处大多数同学使用 @Builder 无非就是为了链式编程,然而 @Builder