AT1983 BBQ Hard
呦,来一次久违的BBQ吧!
AT题…日本的题库质量一向很高
这题是有关组合数的DP…
前置芝士
1.快速计算组合数,具体还是自行百度.
2.膜域下的除法.
具体做法
题目中的问题:
∑i=1n∑j=i+1n(ai+bi+aj+bjai+aj)\sum_{i=1}^{n}\sum_{j=i + 1}^{n}{a_i+b_i+a_j+b_j \choose a_i+a_j}∑i=1n∑j=i+1n(ai+ajai+bi+aj+bj)
提出(ai+bi+aj+bjai+aj){a_i+b_i+a_j+b_j \choose a_i+a_j}(ai+ajai+bi+aj+bj)这部分
感性理解后,可以发现这是原点到(ai+bi,aj+bj)(a_i+b_i,a_j+b_j)(ai+bi,aj+bj)的路径的个数.
但是这样就会想到O(N2)枚举,但是这样显然是T的,所以我们还要继续优化这个式子
将原点平移可以理解为(ai,aj)(a_i,a_j)(ai,aj)到(bi,bj)(b_i,b_j)(bi,bj)的路径个数
是不是觉得很好处理了.
但是∑i=1n∑j=i+1n\sum_{i=1}^{n}\sum_{j=i + 1}^{n}∑i=1n∑j=i+1n中并没有自己到自己的条数,所以需要减去这些多出来的条数
这里如果使用杨辉三角预处理要O(40002*2)感觉十分的不保险,所以就要使用到快速计算组合数.
代码
#include<bits/stdc++.h>
#define rap(i,first,last) for(int i=first;i<=last;++i)
using namespace std;
const int maxN=2005;
const int mod=1e9+7;
const int inv2=500000004;//预处理2的逆元
long long fac[maxN*4+100],inv[maxN*4+100];
long long dp[maxN*2+100][maxN*2+100],N;
int A[1000005],B[1000005];
long long C(int n,int m)//计算组合数
{return 1ll*fac[n]*inv[m]%mod*inv[n-m]%mod;
}
int main()
{//预处理组合数fac[0]=inv[0]=inv[1]=1;rap(i,1,maxN*4)fac[i]=1ll*fac[i-1]*i%mod;rap(i,2,maxN*4)inv[i]=1ll*(mod-mod/i)*inv[mod%i]%mod;rap(i,1,maxN*4)inv[i]=1ll*inv[i-1]*inv[i]%mod;scanf("%d",&N);rap(i,1,N){scanf("%d%d",&A[i],&B[i]);dp[maxN-A[i]][maxN-B[i]]++;//在-A[i],-B[i]位置加一}rap(i,-maxN+1,maxN)rap(j,-maxN+1,maxN){dp[maxN+i][maxN+j]+=dp[maxN+i-1][maxN+j]+dp[maxN+i][maxN+j-1];//类似杨慧三角的DPdp[maxN+i][maxN+j]%=mod;}long long answer=0;rap(i,1,N){answer+=dp[maxN+A[i]][maxN+B[i]];//对答案加上这个位置的方案数answer%=mod;answer-=C(A[i]*2+B[i]*2,A[i]*2);//减去自己到自己的方案数answer=(answer+mod)%mod;}answer*=inv2;//可以发现多计算了一遍,需要除二,在膜域中也就是乘上2的逆元answer%=mod;printf("%lld\n",answer);//输出answerreturn ~0;
}
看似一道简单的DP,其中涉及了各种方面的知识点只有对膜域和组合数掌握的很好才能在做这类题时得心应手.
AT1983 BBQ Hard相关推荐
- AT1983 [AGC001E] BBQ Hard
這遍題解需要用到逆元,學習這個新知識用了兩三個小時. 非常有意思的一道題,可以幫助自己拓展思維. 首先,我們可以想像組合數的幾何意義. 組合數 從n + m 中選 n 個的組合數就是從(0,0)走到( ...
- AT1983-[AGC001E]BBQ Hard【dp,组合数学】
正题 题目链接:https://www.luogu.com.cn/problem/AT1983 题目大意 给出nnn个数对(ai,bi)(a_i,b_i)(ai,bi) 求 ∑i=1n∑j=i+1 ...
- 美拉德不做鬼佬BBQ,只做中国餐饮文化
旅行不仅是看没看过的风景,认识有意思的当地人,吃没吃过的美食也是两大重要且艰巨的任务.最后一定要让费用控制在预算内,谁让帅投君是穷游者呢. 根据之前的经验,吃在旅行中所占的比重大约在15-20%.什么 ...
- [AGC001E]BBQ Hard
BBQ Hard 题解 首先,我们可以考虑组合数是可以被表示成路径的形式的,(n+mm)\binom{n+m}{m}(mn+m)可以表示从点(0,0)(0,0)(0,0)到点(n,m)(n,m)(n ...
- BBQ 回退使用实例
//"技术方向"值,默认全部var tecAspectValue = "all";var roleType;var trainingType;var jsonC ...
- AGC001E BBQ Hard 组合计数
题目链接 题目大概要求的就是∑i=1n∑j=i+1nC(ai+aj+bi+bj,ai+aj)∑i=1n∑j=i+1nC(ai+aj+bi+bj,ai+aj)\displaystyle\sum_{i = ...
- BBQ与比克大魔王(最长路)
问题 A: BBQ与比克大魔王 时间限制: 2 Sec 内存限制: 128 MB 提交: 91 解决: 18 [ 提交][ 状态][ 讨论版] 题目描述 七夕,对BBQ来说是一个伤感的日子,因 ...
- AtCoder AGC001E BBQ Hard (DP、组合计数)
题目链接: https://atcoder.jp/contests/agc001/tasks/agc001_e 题解: 求\(\sum^n_{i=1}\sum^n_{j=i+1} {A_i+A_j+B ...
- BBQ Hard dp + 组合数学 + 建模
传送门 文章目录 题意: 思路: 题意: 有nnn组物品,每组有aia_iai个肉和bib_ibi个菜,你可以选择两组物品让后将肉和菜其串在一根串上,问有多少种不同的串法. 两种方法不同当且仅当选 ...
最新文章
- POJ 1273 Drainage Ditches
- 使用FirefoxDriver时报错Make sure firefox is installed问题
- cocos2dx 大地图分块加载的研究(初)
- linux中Daemon守护进程编程
- 你从未听说过的最重要的数据库,人类登月计划的功臣
- C++ Primer 5th笔记(chap 17 标准库特殊设施)匹配标志
- 一个简单的TCP服务器
- Spring框架 简述
- ajax--跨域问题及三种简单的解决方案
- linux 挖矿效率_linux 服务器发现了挖矿病毒
- 微鲸科大讯飞、出门问问合作 TA的语音功能怎么样?
- 深入浅出Symfony2 - 结合MongoDB开发LBS应用
- Autodesk AutoCAD 2022 产品系列已发布(附下载)
- linux中VScode中文乱码问题:一行代码解决
- 选择BIMC托管电子商务的理由
- 馄饨 (hún tun)
- JBPM工作流引擎内核设计思想及构架
- 基本数据类型之整数类型变量
- PaddleRec与Milvus深度结合,手把手带你体验工业级推荐系统召回速度
- Photoshop:将白色背景转换成透明背景+三原色叠加