Jzoj5644 凫趋雀跃

经典套路容斥题

直接dp做是O(TxTyRk)的可以60分

满分做法又要用到经典的容斥法

我们设f[i][x][y]表示走i步,走到x,y的方案(不考虑不合法向量)

设g[i][x]表示走了i步不合法的向量,走到了(x,x)的方案数

二项式反演得

Answer=∑(-1)^i*C(R,i)*g[i][x]*f[R-i][Tx-x][Ty-x] 

考虑f如何计算,因为x,y两维是独立的

所以有 f[i][x][y]=f[i][x]*f[i][y]  可以O(nm)计算

#pragma GCC optimize("O3")
#pragma G++ optimize("O3")
#include<stdio.h>
#include<string.h>
#include<algorithm>
#define M 10007
using namespace std;
int n,m,x,y,r,K,t[100],s[1610],S,N,js[1610];
int inv[1610],f[1610][1010],g[2][1610][1010];
inline int ad(int& x,int y){ x=(x+y)%M; }
inline int C(int n,int m){ return n>=m?js[n]*inv[m]%M*inv[n-m]%M:0; }
inline void pow(int x,int k,int& s){
	for(s=1;k;x=x*x%M,k>>=1) k&1?s=s*x%M:0;
}
int main(){
	freopen("jump.in","r",stdin);
	freopen("jump.out","w",stdout);
	scanf("%d%d%d%d%d%d",&n,&m,&x,&y,&r,&K);
	for(int i=1;i<=K;++i) scanf("%d",t+i),t[i]/=10;
	for(int i=*js=1;i<=r;++i) js[i]=js[i-1]*i%M;
	for(pow(js[r],M-2,inv[r]);;) break; N=min(n,m)/10;
	for(int i=r;i;--i) inv[i-1]=inv[i]*i%M;
	sort(t+1,t+1+K); K=unique(t+1,t+1+K)-t-1;
	for(int i=**f=1,j,k;i<=r;++i)
	for(j=0;j<=N;++j) for(k=0;k<=K;++k) 
	j>=t[k]?ad(f[i][j],f[i-1][j-t[k]]):0;
	for(int i=**g[0]=1,j;i<=r;++i)
	for(j=0;j<=n;++j) s[j]=(g[0][i-1][j]+(j?s[j-1]:0))%M,
	g[0][i][j]=(s[j]-(j>x?s[j-x-1]:0)+M)%M;
	for(int i=**g[1]=1,j;i<=r;++i)
	for(j=0;j<=m;++j) s[j]=(g[1][i-1][j]+(j?s[j-1]:0))%M,
	g[1][i][j]=(s[j]-(j>y?s[j-y-1]:0)+M)%M;
	for(int i=0;i<=r;++i) for(int j=0;j<=N;++j)
	ad(S,f[i][j]*C(r,i)%M*g[0][r-i][n-j*10]%M*g[1][r-i][m-j*10]%M*(i&1?M-1:1));
	printf("%d\n",(S+M)%M);
}

转载于:https://www.cnblogs.com/Extended-Ash/p/9477105.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
该资源内项目源码是个人的课程设计、毕业设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 该资源内项目源码是个人的课程设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值