IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 2021-10-22 -> 正文阅读

[数据结构与算法]2021-10-22

题目
题目看了很久才看懂,然后自己又研究了很久,虽然找出一点规律,但是暴力写,必然无法过。悲伤,看别人的题解,才觉得精妙无比,需要从行和列分别考虑。
题意:就是一个稻草人周围必须都稻草。稻草人占据一个矩形,问符合这样条件的矩形有多少个?
计算过程如下:令 x = n ? 2 x=n-2 x=n?2 y = m ? 2 y=m-2 y=m?2,对于一个 n ? m n*m n?m的矩形,最先寻找 x ? y x*y x?y中存在多少子个矩阵;然后再分别寻找 ( n ? 1 ) ? m (n-1)*m (n?1)?m的矩形 ( x ? 1 ) ? y (x-1)*y (x?1)?y的矩形中存在多少子个矩阵或是 n ? ( m ? 1 ) n*(m-1) n?(m?1)的矩形中 x ? ( y ? 1 ) x*(y-1) x?(y?1)的矩形中存在多少个矩形;接下来以此类推,直到 n = 3 n=3 n=3 m = 3 m=3 m=3
对于 x x x行,一列的矩形个数为 f ( x ) = x ( x + 1 ) 2 f(x) = \frac{x (x + 1)}{2} f(x)=2x(x+1)?
对于 y y y列,一行的矩形个数为 f ( y ) = y ( y + 1 ) 2 f(y) = \frac{y (y + 1)}{2} f(y)=2y(y+1)?
对于每一个 n ? m n*m n?m的矩形的子矩阵数量总和,为
[ f ( x ) + 2 f ( x ? 1 ) + 3 f ( x ? 2 ) + . . . + x f ( 1 ) ] ? [ f ( y ) + 2 f ( y ? 1 ) + 3 f ( y ? 2 ) + . . . + y f ( 1 ) ] [f(x)+2f(x-1)+3f(x-2)+...+xf(1)]*[f(y)+2f(y-1)+3f(y-2)+...+yf(1)] [f(x)+2f(x?1)+3f(x?2)+...+xf(1)]?[f(y)+2f(y?1)+3f(y?2)+...+yf(1)]
在此可以利用前缀和的想法来实现(本菜鸡学到了,真的是精妙)
利用数组 s u m 1 [ i ] = s u m 1 [ i ] + f [ i ] sum1[i]=sum1[i]+f[i] sum1[i]=sum1[i]+f[i],和数组 s u m 2 [ i ] = s u m 2 [ i ] + s u m 1 [ i ] sum2[i]=sum2[i]+sum1[i] sum2[i]=sum2[i]+sum1[i]进行实现, s u m 2 [ x ] ? s u m 2 [ y ] sum2[x]*sum2[y] sum2[x]?sum2[y]即为一个 n ? m n*m n?m矩形的子矩阵总和。
以下代码就是分别从行和列中进行计算:

#include <bits/stdc++.h>
using namespace std;
#define T int T; scanf("%d", &T); while(T--)
typedef long long ll;
const int N=1e5+1;
const int mod=1e9+7;
ll sum1[N], sum2[N], d[N];

void init(){
	for(ll i=1; i<N; i++){
		d[i]=i*(i+1)/2;
		d[i]%=mod;
	}

	for(ll i=1; i<N; i++){
		sum1[i]=(sum1[i-1]+d[i])%mod;
	}

	for(ll i=1; i<N; i++){
		sum2[i]=(sum2[i-1]+sum1[i])%mod;
	}
}

int main()
{
	init();
	int t=1;
    T{
    	ll n, m;
    	scanf("%lld %lld", &n, &m);
    	if(n<3 || m<3){
    		printf("Case %d: 0\n", t++);
    	} else {
    		printf("Case %d: %lld\n", t++, ((sum2[n-2]%mod)*(sum2[m-2])%mod)%mod);
    	}
    }
	return 0;
}
  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-10-23 12:44:52  更:2021-10-23 12:46:43 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 8:49:39-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码