传送门


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 ki​mod10=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∑R​j=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】凫趋雀跃相关推荐

  1. 【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 旋转操 ...

  2. 【每日早报】2019/08/05

    今日看点 ✦ 国内首款5G手机正式开售,苏宁售出第一台中兴天机Axon 10 Pro 5G版手机 ✦ 国资委:"央企+互联网"是国企混改模式之一,不是所谓的"公私合营&q ...

  3. 周刊 | 回顾一周云行业热点快讯 (2019/08/05)

    行 业 要 闻 Industry   News ▲▲▲ 0 1 7月操作系统市场份额数据:Windows 10持续增长 最新的市场份额数据显示,Windows 10 在2019 年7 月的用户数大幅增 ...

  4. 学习日志——2019/08/05

    事务& 数据连接池& DBUtils 事务 什么是事务? Transaction 其实指的一组操作,里面包含许多个单一的逻辑.只要有一个逻辑没有执行成功,那么都算失败. 所有的数据都回 ...

  5. 大话西游2服务器维护公告,大话西游2经典版:2019年05月09日停机维护公告

    原标题:大话西游2经典版:2019年05月09日停机维护公告 亲爱的玩家: 为了保证服务器的稳定和服务质量,<大话西游2经典版>将于2019年05月09日(本周四)早上8:00停机,进行每 ...

  6. 2019.08.08学习整理

    2019.08.08学习整理 文件的高级应用 1.可读.可写 r+t: 可读.可写 w+t: 可写.可读 a+t: 可追加.可读 # wt with open('36w.txt', 'wt', enc ...

  7. HighNewTech:2019.08.09程序猿界大事件之【你好,我是鸿蒙OS】~【来了,老弟】—技术才是硬道理,开源方能建立新生态!

    High&NewTech:2019.08.09程序猿界大事件之[你好,我是鸿蒙OS]~[来了,老弟]-技术才是硬道理,开源方能建立新生态! 导读       2019华为开发者大会在今日举行, ...

  8. HighNewTech:2019.08.08华为发布—面向2025十大趋势

    High&NewTech:2019.08.08华为发布-面向2025十大趋势 导读        华为今日发布全球产业展望GIV@2025,提出智能世界正在加速而来,触手可及,并预测:到202 ...

  9. HighNewTech:2019.08.08鲲鹏开发入门暨 2019华为云鲲鹏开发者大赛参赛攻略

    High&NewTech:2019.08.08鲲鹏开发入门暨 2019华为云鲲鹏开发者大赛参赛攻略 目录 演讲PPT 1.基础知识 2.赛题解读 3.参赛攻略 4.FAQ 演讲PPT 1.基础 ...

最新文章

  1. Ubuntu 10.10 安装 libx11-dev
  2. 【PP生产订单】入门介绍(四)
  3. Cost Element-成本要素
  4. 计算机专业迎新标语,迎新 || 标题不要了,只要你
  5. 哈工大威海c语言实验报告 第八章 无法运行程序,哈工大威海c语言实验报告.doc...
  6. java类的理解_Java类该怎么理解?
  7. python文件下载速度 装饰器_python学习笔记之---装饰器
  8. 情怀也好,相声也好,请拿产品说话!
  9. AWVS下载、安装步骤教程
  10. python list 添加噪声_在python中为信号添加噪声
  11. FreebuF黑客专访系列之吴翰清(刺):接下来几年,有两样东西必定会火
  12. 《学会呼吸》书中的精髓:如何通过训练自己的呼吸,逐步改善健康问题?
  13. Java端实现JSHOP2的调用
  14. 手机分辨率Android教程(十二)-- 使用DisplayMetrics获取手机分辨率
  15. XPU时代创新者英特尔
  16. 253:丛林中的路——最小生成树Prim
  17. 【文献管理软件Zotero】Zotfile插件及云同步的使用技巧
  18. 【超图+CESIUM】【基础API使用示例】41、超图|CESIUM - 特效-雪景设置
  19. vb获取服务器文件路径,vb打开ftp服务器文件路径
  20. 第二次培训---36个基础命令

热门文章

  1. 【论文|复现]Vertebra-Focused Landmark Detection For Scoliosis Assessment
  2. float /ceil/round区别
  3. Spring framework(10):集成 JMS 异步消息队列(ActiveMQ)
  4. 小猪的Python学习之旅 —— 10.三分钟上手Requests库
  5. scholarscope不显示影响因子_Scholarscope
  6. 设计 VS 架构 VS 框架
  7. ZF2入门:Windows环境下从零开始Zend Framework 2.0 (ZF2)环境搭建
  8. Zend2(ZF2)的Debug及性能分析方法
  9. chrome浏览器崩溃
  10. html5新标签-音频视频