1957C - How Does the Rook Move?

2024-04-22 19:36
文章标签 move rook 1957c

本文主要是介绍1957C - How Does the Rook Move?,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目链接:How Does the Rook Move?

如图:

因为每行每列都只能放一个棋子,因此我们用绿点来表示下的棋子,发现一个规律,当红色格子都被绿线划过时,那么就不能下棋子。当这个白色点放在x=y这个点,也就是横纵坐标相等时,红色这个点只占了一个,而当x!=  y时,占了两个红色格子,然后剩余我们可以填的就是剩下的蓝色格子,和两个红色格子没填,因此转化一下形成了右图。

再看如下图:

首先我们可以得知,每个棋子先下哪里后下哪里最后的结果不变,说的通俗一点,假设给你看别人刚下完的围棋,你知道白棋哪个位置是第一次下的吗?

因此最后的结果跟顺序无关,那么我们可以从最后一个点枚举,我们一次操作可以占一个红色格子,可以占两个红色格子,那么假设占一个格子,最后剩余的红点就是n-1,如果取两个格子,那么我们要从蓝色的区域里面取,也就是从( n - 1 )个格子里面选一个,又因为这是镜像的,所以我们可以选白棋也可以选黑棋,因此要×2.

所以最后的结论就是:
f(n)=f(n-1) + 2*(n-1)*f(n-2) 

代码附上:

#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N =3e5+5;
const int mod = 1e9+7;
int f[N];
int n,k;void solve(){cin>>n>>k;int m=n;for(int i=1;i<=k;i++){int x,y;cin>>x>>y;if(x==y)m-=1;else m-=2; }memset(f,0,sizeof(f));f[0]=f[1]=1;for(int i=2;i<=m;i++){f[i]=(f[i-1]+(2*(i-1)*f[i-2])%mod)%mod;}cout<<f[m]<<"\n";
}signed main(){ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);int t;cin>>t;while(t--){solve();}return 0;
}

这篇关于1957C - How Does the Rook Move?的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Unity3D 运动之Move函数和translate

CharacterController.Move 移动 function Move (motion : Vector3) : CollisionFlags Description描述 A more complex move function taking absolute movement deltas. 一个更加复杂的运动函数,每次都绝对运动。 Attempts to

12C 新特性,MOVE DATAFILE 在线移动 包括system, 附带改名 NID ,cdb_data_files视图坏了

ALTER DATABASE MOVE DATAFILE  可以改名 可以move file,全部一个命令。 resue 可以重用,keep好像不生效!!! system照移动不误-------- SQL> select file_name, status, online_status from dba_data_files where tablespace_name='SYSTEM'

【Python报错已解决】`AttributeError: move_to requires a WebElement`

🎬 鸽芷咕:个人主页  🔥 个人专栏: 《C++干货基地》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活! 文章目录 引言:一、问题描述:1.1 报错示例:1.2 报错分析:1.3 解决思路: 二、解决方法:2.1 方法一:正确获取并传递WebElement对象2.2 步骤二:使用find_element_by_*方法直接获取元素 三、其

[LeetCode] 283. Move Zeroes

题:https://leetcode.com/problems/move-zeroes/submissions/1 题目 Given an array nums, write a function to move all 0’s to the end of it while maintaining the relative order of the non-zero elements. Ex

(二)、软硬件全开源智能手表,可全面高精度采集生命体征数据,进行健康检测。(HealthyPi Move)

HealthyPi Move是一款开放式硬件设备,可让您高精度地跟踪所有生命体征。它不仅仅是另一款带有心率监测器的智能手表,它还是手腕上的完整生命体征监测和记录设备,可以测量心电图(ECG)、光电容积脉搏波 (PPG)、SpO₂、血压(基于手指)、EDA/GSR、心率变异性(HRV)、呼吸频率,甚至体温。  01、特性与规格 微控制器:Nordic nRF5340 双核 ARM M3

ROS naviagtion analysis: move_base

这是navigation的第一篇文章,主要通过分析ROS代码级实现,了解navigation。本文从move_base入手。 机器人导航主要框架如图: Navigation Stack主要组成部分:move_base: 用户调用movebase是通过传入带tf参数的构造函数: move_base::MoveBase move_base( tf ); 以下分析move_base

F - Rook on Grid 矩阵 侧面视角 树状数组

两种走法 先下再右 吃到的就是L[i]-1个 先右再下 就吃剩的哈哈 每个L[i]挡住的阴影部分 才是有效的吃到部分 关于阴影 🔥可以想象从矩阵右侧有光线照进来。然后被障碍物挡住的那些空格。 处理方式可以按照列扫过去。一边用树状数组维护那些有阴影的行 实现的主要部分就是怎么去维护那些阴影。 小tip:>=r[i]都当做第一列开始就有阴影 题目 #include <bits/stdc++.h>

c++11--std::move

move的实现原理 move对哪些数据有用 #include <iostream>#include <vector>#include <memory>int main(){// intint a = 100;int b = std::move(a);std::cout << "a= " << a << std::endl;std::cout << "b= " << b <<

右值,右值引用,move,forward

区分左值和右值 一个最为典型的判别方法就是,在赋值表达式中,出现在等号左边的就是“左值”,而在等号右边的,则称为“右值”。 还有一个说法,就是可以取地址的、有名字的就是左传,反之,不能取地址的、没有名字的就是右值。 右值又分将亡值(xvalue),纯右值。 引用 引用类型本身自己并不拥有所绑定对象的内存,只是该对象的一个别名。 右值引用 右值引用标记为T&& 用右值引用

【playwright篇】page.mouse.wheel/page.mouse.move

page.mouse.wheel(x, y, delta_x=0, delta_y=0) 参数说明 x: 鼠标指针的 X 坐标(相对于页面的左边缘)。y: 鼠标指针的 Y 坐标(相对于页面的顶部边缘)。delta_x (可选): 水平方向上的滚动距离(单位为像素)。正值表示向右滚动,负值表示向左滚动。默认为 0。delta_y (可选): 垂直方向上的滚动距离(单位为像素)。正值表示向下滚动,