#dp,模型转换,排列组合#AT1983 [AGC001E] BBQ Hard
题目
有两个长度为\(n\)的序列\(a,b\),需要求
\]
其中\(n\leq 200000,a,b\leq 2000\)
分析
突破口在\(a,b\)的小范围,观察后面这一坨东西
也就是一个长宽分别为\(a_i+a_j,b_i+b_j\)的矩阵
从左下角走到右上角只能通过向上或者向右的方法,这东西可以用\(dp\)解决
那我如果可以把所有\((a_i,b_i)\)扔到\(dp\)里解决自然就搞定了,考虑将坐标平移
那么也就是求\((-a_i,-b_i)\)到\((a_j,b_j)\)的方案数,
那这样互不干扰给每一个起点加1,直接大力\(dp\)
注意先要减去\((-a_i,-b_i)\)到\((a_i,b_i)\)的方案然后再除以2(按照题意)
代码
#include<cstdio>
#include<cctype>
#define rr register
using namespace std;
const int M=4003,N=200011,mod=1000000007;
int dp[M][M],n,fac[M<<1],inv[M<<1],a[N],b[N],ans;
inline signed iut(){
    rr int ans=0; rr char c=getchar();
    while(!isdigit(c)) c=getchar();
    while(isdigit(c)) ans=ans*10+c-48,c=getchar();
    return ans;
}
inline signed mo(int x,int y){return x+y>=mod?x+y-mod:x+y;}
inline signed c(int n,int m){return 1ll*fac[n]*inv[m]%mod*inv[n-m]%mod;}
signed main(){
    n=iut(),fac[0]=fac[1]=inv[0]=inv[1]=1;
    rr int t=M>>1,T=t<<2;
    for (rr int i=2;i<=T;++i) inv[i]=1ll*inv[mod%i]*(mod-mod/i)%mod;
    for (rr int i=2;i<=T;++i) fac[i]=1ll*fac[i-1]*i%mod,inv[i]=1ll*inv[i-1]*inv[i]%mod;
    for (rr int i=1;i<=n;++i){
        a[i]=iut(),b[i]=iut();
        ++dp[t-a[i]][t-b[i]];
    }
    for (rr int i=1;i<M;++i)
    for (rr int j=1;j<M;++j){
        rr int w=mo(dp[i-1][j],dp[i][j-1]);
        dp[i][j]=mo(dp[i][j],w);
    }
    for (rr int i=1;i<=n;++i){
        ans=mo(ans,dp[t+a[i]][t+b[i]]);
        ans=mo(ans,mod-c(a[i]*2+b[i]*2,a[i]*2));
    }
    return !printf("%d\n",1ll*ans*inv[2]%mod);
}
#dp,模型转换,排列组合#AT1983 [AGC001E] BBQ Hard的更多相关文章
- BZOJ 1072: [SCOI2007]排列perm [DP 状压 排列组合]
		题意:给一个数字串s和正整数d, 统计s有多少种不同的排列能被d整除(可以有前导0) 100%的数据满足:s的长度不超过10, 1<=d<=1000, 1<=T<=15 看到整 ... 
- Day2:T3DP(基于排列组合思想)
		T3:DP(基于排列组合思想的状态转移) 其实之前写排列组合的题目有一种很茫然的感觉.... 应该是因为之前没有刷过所以没有什么体会 上次刷的vj1060有用到,但是写状态转移还是第一次学习吧 ccy ... 
- 【noi 2.6_9288】&【hdu 1133】Buy the Ticket(DP / 排列组合 Catalan+高精度除法)
		题意:有m个人有一张50元的纸币,n个人有一张100元的纸币.他们要在一个原始存金为0元的售票处买一张50元的票,问一共有几种方案数. 解法:(学习了他人的推导后~) 1.Catalan数的应用7的变 ... 
- LightOJ1005 Rooks(DP/排列组合)
		题目是在n*n的棋盘上放k个车使其不互相攻击的方案数. 首先可以明确的是n*n最多只能合法地放n个车,即每一行都指派一个列去放车. dp[i][j]表示棋盘前i行总共放了j个车的方案数 dp[0][0 ... 
- 【BZOJ】2111: [ZJOI2010]Perm 排列计数   计数DP+排列组合+lucas
		[题目]BZOJ 2111 [题意]求有多少1~n的排列,满足\(A_i>A_{\frac{i}{2}}\),输出对p取模的结果.\(n \leq 10^6,p \leq 10^9\),p是素数 ... 
- 【BZOJ】4559: [JLoi2016]成绩比较 计数DP+排列组合+拉格朗日插值
		[题意]n位同学(其中一位是B神),m门必修课,每门必修课的分数是[1,Ui].B神碾压了k位同学(所有课分数<=B神),且第x门课有rx-1位同学的分数高于B神,求满足条件的分数情况数.当有一 ... 
- HDU 5816 状压DP&排列组合
		---恢复内容开始--- Hearthstone Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java ... 
- 2017ACM暑期多校联合训练 - Team 8 1011    HDU 6143    Killer Names      (容斥+排列组合,dp+整数快速幂)
		题目链接 Problem Description Galen Marek, codenamed Starkiller, was a male Human apprentice of the Sith ... 
- bzoj 3398 [Usaco2009 Feb]Bullcow 牡牛和牝牛——前缀和优化dp / 排列组合
		题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3398 好简单呀.而且是自己想出来的. dp[ i ]表示最后一个牡牛在 i 的方案数. 当前 ... 
- Codeforces 140E(排列组合、dp)
		要点 主要学到的东西:一个序列染色,相邻不染同色,恰用\(j\)种颜色的1.模式数.2.方案数.3.具体染色数. 从大的思路上来讲:先dp预处理出每一层的模式数:\(f[i][j]\)表示\(i\)个 ... 
随机推荐
- gin中间件&控制器
			中间件 Gin 框架允许开发者在处理请求的过程中,加入用户自己的钩子(Hook)函数.这个钩子函数就叫中间件,中间件适合处理一些公共的业务逻辑,比如登录认证.权限校验.数据分页.记录日志.耗时统计等. ... 
- ASP.NET Core 微信支付(四)【支付结果通知回调(未按照官方步骤) APIV3】
			官方文档 支付通知API 证书和回调报文解密 参考资料 netcore 中没有Request.InputStream 理论实战 对于我来说,这个微信支付结果通知回调有两个难点. 难点一 一开始在想是怎 ... 
- pip相关知识
			正常安装语法 # 安装单个 pip install some-package # 安装指定版本 pip install some-package==版本号 # 查看当前模块版本号 pip instal ... 
- 删除无用的docker镜像与容器
			docker rm `docker ps -a | grep Exited | awk '{print $1}'` 删除异常停止的docker容器 docker rmi -f `docker imag ... 
- axios 报 登出跨域 withCredentials: false,
			withCredentials: false, 默认值虽然是false,但是之前包装的时候设置成true了,所以最后再设置回来 
- 学习笔记-涛讲F#(基础)
			目录 简介 类型推导 多个输入参数的函数 定义单位 偏函数 常量也是函数 返回值(unit与ignore) 函数串联实现"开方乘十" 使用管道符 |> 元组(参数加上括号) ... 
- 基于python的json和cvs格式转换
			一 概念 1 json: JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式. 易于人阅读和编写.同时也易于机器解析和生成. 它基于JavaScript Pr ... 
- "高绩效"指南
			前言 最近被问到一个问题,在工作中,如何拿高绩效.或者换一种表达方式,如何成为老板的"嫡系". 在这里我想简单谈一谈我的想法,可能不准确,各位看官,当饭后茶语罢了. 为了更加有说服 ... 
- libwebsockets支持外部eventloop变更
			早些年还在使用2.4+版本,现在最新版已经到4.1+,centos 7也使用3.+版本.对于使用外部eventloop相关的接口发生了大的变更.libev也应为早早对iouring支持,4+版本亲睐l ... 
- shell实现简单的数组排序
			c++代码 int nums[8]={1,2,1,3,4,2,5,6}; int length=8; for(int i=0;i<length;i++){ for(int j=i+1;j< ... 
