[JLOI2015] 骗我呢——一类经典反射容斥

news/2024/11/17 16:21:59/文章来源:https://www.cnblogs.com/AK-IOI/p/18381431

反射容斥

一层反射:有一条线 \(y=x+b\) 不能碰到。

从第一次碰到直线开始,将后面的部分沿直线翻折,最终一定会到达 \((n-b,n+b)\),因为 \(b\ne 0\),所以构成双射。答案即为 \(\binom{2n}{n}-\binom{2n}{n-b}\)

注意,如果最终到达的位置是 \((n,m)\),反射后 \(n,m\)互换,答案为 \(\binom{n+m}{m}-\binom{n+m}{n-1}\)

卡特兰数

将左括号看作向右,右括号看作向上,则等价于不能碰到 \(y=x+1\),故卡特兰数有组合意义:\(\binom{2n}{n}-\binom{2n}{n-1}\)

二层反射容斥

每一次碰到线后记录 AAABBBAABBABA的形式,相邻的合并,得到ABABAB的形式,容斥即可,正确性地方太小。

设第一条线为 \(y_1=x+l,y_2=x+r\)\(l<0<r\),那么有答案:

\[ans=\sum_{k\in \Z}\binom{n+m}{n-k(r-l)}-\binom{n+m}{n-k(r-l)+r} \]

注意:\(k\in \Z\),只需要求组合数有意义即算入答案。

P3266 [JLOI2015] 骗我呢

求有多少个 \(n\times m\) 的数组,满足 \(x_{i,j}<x_{i,j+1},x_{i,j}<x_{i-1,j+1}\),每个位置可以填 \([0,m]\) 的数。

\(n,m\le 10^6\)

容易观察到每一行都是递增的,而且每一行都恰好少一个数,且少的这个数是单调递增的,我们可以直接列 DP 方程。

\(dp_{i,j}\) 表示第 \(i\) 行少的数是 \(j\),有:

\[dp_{i,j}=\sum_{k=1}^{k\le j+1}dp_{i-1,k}=dp_{i,j-1}+dp_{i-1,j+1} \]

是形式上非常简洁的 DP,系数均为 \(1\),但不能进行任何数据结构优化。我们考虑放在网格图上计数

iwUEt0.png (236×173) (ax1x.com)

注意到只有第一列有直上直下的转移,这是因为 \(dp_{i,0}=1\)

我们从第二行开始,每一行在上一行的基础上向右平移一格,就可以得到标准的转移:

iwUwBd.png (397×154) (ax1x.com)

iwUt1O.png (526×276) (ax1x.com)

发现相当于不能碰直线 \(y_1=x+1\)\(y_2=x-(m+2)\)

#include <bits/stdc++.h>
#define int long long
#define pii pair<int,int>
#define fi first
#define se second
using namespace std;
int read(){char c=getchar();int h=0,tag=1;while(!isdigit(c)) tag=(c=='-'?-1:1),c=getchar();while(isdigit(c)) h=(h<<1)+(h<<3)+(c^48),c=getchar();return h*tag;
}
void fil(){freopen("data.in","r",stdin);freopen("data.out","w",stdout);
}
const int mod=1e9+7;
const int N=3e6+5;
int fac[N],inv[N];
int ksm(int a,int b) {if(b==1) return a%mod;int s=ksm(a,b/2);s=s*s%mod;if(b%2==1) s=s*a%mod;return s%mod;
}
int binom(int n,int m) {if(m<0||n<m) return 0;return fac[n]*inv[m]%mod*inv[n-m]%mod;
}
signed main(){
//	fil();int n=read(),m=read();int l=-m-2,r=1;int _n=n+m+1,_m=n;inv[0]=1,fac[0]=1;for(int i=1;i<=N-100;i++) fac[i]=fac[i-1]*i%mod,inv[i]=ksm(fac[i],mod-2)%mod;	int ans=0;for(int i=-1000000;i<=N;i++) {if(_n-i*(r-l)+r>(_n+_m)) continue;if(_n-i*(r-l)<0) break;ans+=binom(_n+_m,_n-i*(r-l))-binom(_n+_m,_n-i*(r-l)+r);ans=(ans+mod)%mod;}cout<<ans<<endl;return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/787626.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

南沙区信息学奥林匹克竞赛(信奥赛)介绍

​信息学奥林匹克竞赛(International Olympiad in Informatics,IOI)是一项旨在选拔和培养信息技术和计算机科学人才的国际性竞赛。该竞赛始于1989年,每年举办一次,由不同的国家轮流承办。参加比赛的选手来自全球各国,都是信息技术和计算机科学领域的尖子生。信息学奥林匹…

英文单词字母大小写在线转换工具html代码

这是一个简单而实用的在线大小写转换工具。它允许用户输入任意文本,并提供三种转换选项:转换为全大写、全小写或首字母大写。 使用这个工具非常简单快捷。用户只需要在输入框中输入想要转换的文本,选择合适的转换类型,然后点击"转换"按钮即可。转换结果会立即显示在输…

TCP的调试助手开发笔记

动图:1 先利用VS自带的socket类来写好TCP_CORE: 类目录如下:点击查看代码 using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Net; using System.Net.Sockets; using System.Text; using System.Text.RegularExp…

Why Transformers Need Adam: A Hessian Perspective

目录概符号说明所有参数的 Hessian 矩阵Block-wise Hessian代码Zhang Y., Chen C., Ding T., Li Z., Sun R. and Luo Z. Why transformers need adam: a hessian perspective. arXiv preprint, 2024.概 本文从 Hessian 矩阵的角度回答为什么 Adam 相较于其它方法, 比如 SGD 在 …

VL24 边沿检测

这个就是需要对a 进行打一拍last_a<=a; 需要理解的点是打一拍的last_a是落后a一个时钟周期的,也就是对当前时刻使用a时候,此时的last_a是a的上一时刻的值。`timescale 1ns/1ns module edge_detect(input clk,input rst_n,input a,output reg rise,output reg down ); reg …

RE入门第三天---TEA算法

OK,老规矩,先复习一下昨天的内容 ..... 几分钟就复习了,直接开干今天的内容 先找大佬的wp 来源: TEA系列加密解密 | Gruges Blog (g2uge.github.io) 逆向算法之TEA算法 - Sk2rw - 博客园 (cnblogs.com) 一.TEA加密解密简介 在密码学中,微型加密算法(Tiny Encryption Algo…

vue3 控制el-dialog 双向绑定显示隐藏

父组件<Contact v-model:isView="isView" /> 子组件<template><div><el-dialogwidth="400"title="微信二维码":model-value="props.isView"@closed="handleClose"><div class="dialog-div…

Typora使用PicGo自动上传图片

Gitee配置PicGo图床 简介 由于我们使用Markdown写博客时需要上传一些图片,以便于理解。但是md文件不像Word文件一样能承载图片传输,所以我们使用md文件进行多设备协作,或者传输发给其他人的时候,图片的传输成了很大的问题。一般情况下我们可以搭建一个文件服务器,但是这样…

【网络安全C10-2024.8.24】-docker、数据库、Web应用程序安全

1、在docker中分别以后台方式和交互方式启动centos,对比启动后的容器状态,实现退出容器也能保持其运行状态。docker run -d --name centos7-001 centos docker run -it --name centos7-002 centos /bin/bash docker run -d -t --name centos7-003 centos2、在docker并部署DVW…

网络安全C10-2024.8.24-docker、数据库、Web应用程序安全

docker run -d --name centos7-001 centos docker run -it --name centos7-002 centos /bin/bash docker run -d -t --name centos7-003 centos docker pull sagikazarmark/dvwa docker run -d -p 8082:80 -p 33060:3306 --name dvwa sagikazarmark/dvwa