【2019/08/05测试 T3】凫趋雀跃
传送门
problem
有一个网格,每一步可以走 ( 0 … M x , 0 … M y ) (0…Mx,0…My) (0…Mx,0…My) 中任意非零向量。
有 K K K 种向量不能走,分别是 ( k i , k i (k_i,k_i (ki,ki),其中 k i k_i ki 是 10 10 10 的倍数。
求从 ( 0 , 0 ) (0,0) (0,0) 走 R R R 步到 ( T x , T y ) (Tx,Ty) (Tx,Ty) 的方案数。对 1 0 4 + 7 10^4+7 104+7 取模。
数据范围: 1 ≤ T x , T y , M x , M y ≤ 800 1 ≤ Tx, Ty, Mx, My ≤ 800 1≤Tx,Ty,Mx,My≤800, 1 ≤ R ≤ 1600 1 ≤ R ≤ 1600 1≤R≤1600, 0 ≤ K ≤ 50 0 ≤ K ≤50 0≤K≤50, 1 ≤ k i ≤ m i n ( M x , M y ) 1 ≤ k_i ≤ min(Mx, My) 1≤ki≤min(Mx,My),且 k i   m o d   10 = 0 k_i \bmod 10 = 0 kimod10=0。
solution
算是一道比较考思维的题吧。
先不考虑非法向量, ( 0 , 0 ) (0,0) (0,0) 也先视为合法的。
我们用 f [ i ] [ x ] [ y ] f[i][x][y] f[i][x][y] 表示:走 i i i 步任意向量,走到 ( x , y ) (x, y) (x,y) 的方案数。
但是这样显然是会炸空间的,我们不妨换种表示方式,即用 f x [ i ] [ j ] f_x[i][j] fx[i][j] 表示走 i i i 步走到横坐标 ≤ j \le j ≤j 的方案数, f y [ i ] [ j ] f_y[i][j] fy[i][j] 同理。
考虑转移,用 f x [ i ] [ j ] f_x[i][j] fx[i][j] 的前缀和即可快速转移,方程如下( f y f_y fy 计算同理):
f x [ i ] [ j ] = f x [ i ] [ j − 1 ] + f x [ i − 1 ] [ j ] − f x [ i − 1 ] [ j − M x − 1 ] f_x[i][j]=f_x[i][j-1]+f_x[i-1][j]-f_x[i-1][j-Mx-1] fx[i][j]=fx[i][j−1]+fx[i−1][j]−fx[i−1][j−Mx−1]
注意一下边界。那么显然有 f [ i ] [ x ] [ y ] = f x [ i ] [ x ] × f y [ i ] [ y ] f[i][x][y]=f_x[i][x]\times f_y[i][y] f[i][x][y]=fx[i][x]×fy[i][y]。
现在考虑如何减掉非法向量。
我们用 g [ i ] [ x ] g[i][x] g[i][x] 表示:走 i i i 步非法的向量,走到 ( 10 x , 10 x ) (10x, 10x) (10x,10x) 的方案数。
显然有转移:
g [ i + 1 ] [ x + k j ] ← g [ i ] [ x ] g[i+1][x+k_j]\leftarrow g[i][x] g[i+1][x+kj]←g[i][x]
然后我们用容斥的思想,最后的答案就是:
a n s = ∑ i = 0 R ∑ j = 0 ⌊ m i n ( T x , T y ) 10 ⌋ ( − 1 ) i ( i R ) g [ i ] [ j ] × f [ R − i ] [ T x − 10 j ] [ T y − 10 j ] ans=\sum_{i=0}^R\sum_{j=0}^{\lfloor \frac{min(Tx,Ty)}{10}\rfloor} (-1)^i(^R_i)g[i][j]\times f[R-i][Tx-10j][Ty-10j] ans=i=0∑Rj=0∑⌊10min(Tx,Ty)⌋(−1)i(iR)g[i][j]×f[R−i][Tx−10j][Ty−10j]
code
#include<cstdio>
#include<vector>
#include<cstring>
#include<algorithm>
using namespace std;
const int X=805,R=1605,P=1e4+7;
int Tx,Ty,Mx,My,r,K;
int fac[R],inv[R],fx[R][X],fy[R][X],g[R][X/10];
vector<int>ban;
int add(int x,int y) {return x+y>=P?x+y-P:x+y;}
int dec(int x,int y) {return x-y< 0?x-y+P:x-y;}
int mul(int x,int y) {return 1ll*x*y%P;}
int power(int a,int b,int ans=1){for(;b;b>>=1,a=mul(a,a))if(b&1) ans=mul(ans,a);return ans;
}
void prework(){fac[0]=fac[1]=1;for(int i=2;i<R;++i) fac[i]=mul(fac[i-1],i);inv[R-1]=power(fac[R-1],P-2);for(int i=R-2;~i;--i) inv[i]=mul(inv[i+1],i+1);
}
int C(int n,int m) {return mul(mul(inv[m],inv[n-m]),fac[n]);}
int F(int r,int x,int y) {return mul(dec(fx[r][x+1],fx[r][x]),dec(fy[r][y+1],fy[r][y]));}
int solve(){prework();int top=min(Tx,Ty)/10;g[0][0]=1;for(int i=1;i<=r;++i){for(int j=0;j<ban.size();++j){int x=ban[j]/10;for(int k=x;k<=top;++k) g[i][k]=add(g[i][k],g[i-1][k-x]);}}for(int i=1;i<=Tx+1;++i) fx[0][i]=1;for(int i=1;i<=r;++i)for(int j=1;j<=Tx+1;++j)fx[i][j]=dec(add(fx[i][j-1],fx[i-1][j]),fx[i-1][j-min(j-1,Mx)-1]);for(int i=1;i<=Ty+1;++i) fy[0][i]=1;for(int i=1;i<=r;++i)for(int j=1;j<=Ty+1;++j)fy[i][j]=dec(add(fy[i][j-1],fy[i-1][j]),fy[i-1][j-min(j-1,My)-1]);int ans=0;for(int i=0;i<=r;++i){int now=(i&1)?(P-C(r,i)):C(r,i);for(int j=0;j<=top;++j)ans=add(ans,mul(mul(now,g[i][j]),F(r-i,Tx-10*j,Ty-10*j)));}return ans;
}
int main(){scanf("%d%d%d%d%d%d",&Tx,&Ty,&Mx,&My,&r,&K);for(int i=1,x;i<=K;++i) scanf("%d",&x),ban.push_back(x);ban.push_back(0);printf("%d\n",solve());return 0;
}
【2019/08/05测试 T3】凫趋雀跃相关推荐
- 【2019/08/05测试 T2】尺树寸泓
传送门 problem 数据范围:点数 n n n 和操作数 Q Q Q 满足 1 ≤ n , Q ≤ 2 × 1 0 5 1≤n,Q≤2×10^5 1≤n,Q≤2×105. solution 旋转操 ...
- 【每日早报】2019/08/05
今日看点 ✦ 国内首款5G手机正式开售,苏宁售出第一台中兴天机Axon 10 Pro 5G版手机 ✦ 国资委:"央企+互联网"是国企混改模式之一,不是所谓的"公私合营&q ...
- 周刊 | 回顾一周云行业热点快讯 (2019/08/05)
行 业 要 闻 Industry News ▲▲▲ 0 1 7月操作系统市场份额数据:Windows 10持续增长 最新的市场份额数据显示,Windows 10 在2019 年7 月的用户数大幅增 ...
- 学习日志——2019/08/05
事务& 数据连接池& DBUtils 事务 什么是事务? Transaction 其实指的一组操作,里面包含许多个单一的逻辑.只要有一个逻辑没有执行成功,那么都算失败. 所有的数据都回 ...
- 大话西游2服务器维护公告,大话西游2经典版:2019年05月09日停机维护公告
原标题:大话西游2经典版:2019年05月09日停机维护公告 亲爱的玩家: 为了保证服务器的稳定和服务质量,<大话西游2经典版>将于2019年05月09日(本周四)早上8:00停机,进行每 ...
- 2019.08.08学习整理
2019.08.08学习整理 文件的高级应用 1.可读.可写 r+t: 可读.可写 w+t: 可写.可读 a+t: 可追加.可读 # wt with open('36w.txt', 'wt', enc ...
- HighNewTech:2019.08.09程序猿界大事件之【你好,我是鸿蒙OS】~【来了,老弟】—技术才是硬道理,开源方能建立新生态!
High&NewTech:2019.08.09程序猿界大事件之[你好,我是鸿蒙OS]~[来了,老弟]-技术才是硬道理,开源方能建立新生态! 导读 2019华为开发者大会在今日举行, ...
- HighNewTech:2019.08.08华为发布—面向2025十大趋势
High&NewTech:2019.08.08华为发布-面向2025十大趋势 导读 华为今日发布全球产业展望GIV@2025,提出智能世界正在加速而来,触手可及,并预测:到202 ...
- HighNewTech:2019.08.08鲲鹏开发入门暨 2019华为云鲲鹏开发者大赛参赛攻略
High&NewTech:2019.08.08鲲鹏开发入门暨 2019华为云鲲鹏开发者大赛参赛攻略 目录 演讲PPT 1.基础知识 2.赛题解读 3.参赛攻略 4.FAQ 演讲PPT 1.基础 ...
最新文章
- Ubuntu 10.10 安装 libx11-dev
- 【PP生产订单】入门介绍(四)
- Cost Element-成本要素
- 计算机专业迎新标语,迎新 || 标题不要了,只要你
- 哈工大威海c语言实验报告 第八章 无法运行程序,哈工大威海c语言实验报告.doc...
- java类的理解_Java类该怎么理解?
- python文件下载速度 装饰器_python学习笔记之---装饰器
- 情怀也好,相声也好,请拿产品说话!
- AWVS下载、安装步骤教程
- python list 添加噪声_在python中为信号添加噪声
- FreebuF黑客专访系列之吴翰清(刺):接下来几年,有两样东西必定会火
- 《学会呼吸》书中的精髓:如何通过训练自己的呼吸,逐步改善健康问题?
- Java端实现JSHOP2的调用
- 手机分辨率Android教程(十二)-- 使用DisplayMetrics获取手机分辨率
- XPU时代创新者英特尔
- 253:丛林中的路——最小生成树Prim
- 【文献管理软件Zotero】Zotfile插件及云同步的使用技巧
- 【超图+CESIUM】【基础API使用示例】41、超图|CESIUM - 特效-雪景设置
- vb获取服务器文件路径,vb打开ftp服务器文件路径
- 第二次培训---36个基础命令
热门文章
- 【论文|复现]Vertebra-Focused Landmark Detection For Scoliosis Assessment
- float /ceil/round区别
- Spring framework(10):集成 JMS 异步消息队列(ActiveMQ)
- 小猪的Python学习之旅 —— 10.三分钟上手Requests库
- scholarscope不显示影响因子_Scholarscope
- 设计 VS 架构 VS 框架
- ZF2入门:Windows环境下从零开始Zend Framework 2.0 (ZF2)环境搭建
- Zend2(ZF2)的Debug及性能分析方法
- chrome浏览器崩溃
- html5新标签-音频视频