B20J_1297_[SCOI2009]迷路_矩阵乘法

题意:

有向图 N 个节点,从节点 0 出发,必须恰好在 T 时刻到达节点 N-1。总共有多少种不同的路径?

2 <= N <= 10 ; 1 <= T <= 1000000000   边权范围[1,9].

分析:

首先看题目数据性质,N很小,即使是完全图边数也不会超过100。因此我们可以利用矩阵乘法优化。

如何优化:1.我们发现,当边权为1时每走一步就相当于乘上一次图的邻接矩阵。可以用矩阵快速幂O(N^3*logT)快速解决;

2.如果边权不为1我们可以运用拆点的技巧,把边拆成等同边权长度个点。

代码:

值得注意的是答案应是所求点的入点,而不是所有小点求和。

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <algorithm>
  4. using namespace std;
  5. #define mem(x) memset(&x,0,sizeof(x))
  6. #define LL long long
  7. LL f[91][91],n,t,cnt,p=2009;
  8. struct mat
  9. {
  10. LL v[91][91];
  11. };
  12. mat mul(const mat &x,const mat &y)
  13. {
  14. mat re;mem(re);
  15. for(int i=1;i<=cnt;i++)
  16. {
  17. for(int j=1;j<=cnt;j++)
  18. {
  19. for(int k=1;k<=cnt;k++)
  20. {
  21. re.v[i][j]=(re.v[i][j]+x.v[i][k]*y.v[k][j])%p;
  22. }
  23. }
  24. }
  25. return re;
  26. }
  27. void pow()
  28. {
  29. mat I,x;mem(I);mem(x);
  30. for(int i=1;i<=9*n;i++)I.v[i][i]=1;
  31. for(int i=1;i<=9*n;i++)
  32. {
  33. for(int j=1;j<=9*n;j++)
  34. {
  35. x.v[i][j]=f[i][j];
  36. }
  37. }
  38. while(t)
  39. {
  40. if(t&1)I=mul(I,x);
  41. x=mul(x,x);
  42. t>>=1;
  43. }
  44. printf("%lld",I.v[1][(n-1)*9+1]%p);
  45. }
  46. int main()
  47. {
  48. scanf("%d%d",&n,&t);
  49. cnt=9*n;
  50. int x;
  51. for(int i=1;i<=n;i++)
  52. {
  53. for(int j=1;j<=n;j++)
  54. {
  55. scanf("%1d",&x);
  56. int now=(i-1)*9+1;
  57. if(!x)continue;
  58. if(x==1)f[(i-1)*9+1][(j-1)*9+1]=1;
  59. else
  60. {
  61. for(int k=1;k<=x;k++)
  62. {
  63. if(k==x)
  64. {
  65. f[now][(j-1)*9+1]=1;break;
  66. }
  67. f[now][now+1]=1;
  68. now++;
  69. }
  70. }
  71. }
  72. }
  73. pow();
  74. }
  75. /***************************************************************
  76. Problem: 1113
  77. User: 20170105
  78. Language: C++
  79. Result: Accepted
  80. Time:616 ms
  81. Memory:1104 kb
  82. ****************************************************************/

  

B20J_1297_[SCOI2009]迷路_矩阵乘法的更多相关文章

  1. [Bzoj1297][Scoi2009 ]迷路 (矩阵乘法 + 拆点)

    1297: [SCOI2009]迷路 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1385  Solved: 993[Submit][Status] ...

  2. 1297. [SCOI2009]迷路【矩阵乘法】

    Description windy在有向图中迷路了. 该有向图有 N 个节点,windy从节点 0 出发,他必须恰好在 T 时刻到达节点 N-1. 现在给出该有向图,你能告诉windy总共有多少种不同 ...

  3. BZOJ_1875_[SDOI2009]HH去散步_矩阵乘法

    BZOJ_1875_[SDOI2009]HH去散步_矩阵乘法 Description HH有个一成不变的习惯,喜欢饭后百步走.所谓百步走,就是散步,就是在一定的时间 内,走过一定的距离. 但 是同时H ...

  4. BZOJ_5015_[Snoi2017]礼物_矩阵乘法

    BZOJ_5015_[Snoi2017]礼物_矩阵乘法 Description 热情好客的请森林中的朋友们吃饭,他的朋友被编号为 1-N,每个到来的朋友都会带给他一些礼物:.其中,第 一个朋友会带给他 ...

  5. BZOJ_4870_[Shoi2017]组合数问题_矩阵乘法

    BZOJ_4870_[Shoi2017]组合数问题_矩阵乘法 Description Input 第一行有四个整数 n, p, k, r,所有整数含义见问题描述. 1 ≤ n ≤ 10^9, 0 ≤ ...

  6. BZOJ_4002_[JLOI2015]有意义的字符串_矩阵乘法

    BZOJ_4002_[JLOI2015]有意义的字符串_矩阵乘法 Description B 君有两个好朋友,他们叫宁宁和冉冉.有一天,冉冉遇到了一个有趣的题目:输入 b;d;n,求 Input 一行 ...

  7. BZOJ_1712_[Usaco2007 China]Summing Sums 加密_矩阵乘法

    BZOJ_1712_[Usaco2007 China]Summing Sums 加密_矩阵乘法 Description     那N只可爱的奶牛刚刚学习了有关密码的许多算法,终于,她们创造出了属于奶牛 ...

  8. BZOJ_4818_[Sdoi2017]序列计数_矩阵乘法

    BZOJ_4818_[Sdoi2017]序列计数_矩阵乘法 Description Alice想要得到一个长度为n的序列,序列中的数都是不超过m的正整数,而且这n个数的和是p的倍数.Alice还希望 ...

  9. 【BZOJ1297】[SCOI2009]迷路(矩阵快速幂)

    [BZOJ1297][SCOI2009]迷路(矩阵快速幂) 题面 BZOJ 洛谷 题解 因为边权最大为\(9\),所以记录往前记录\(9\)个单位时间前的.到达每个点的方案数就好了,那么矩阵大小就是\ ...

随机推荐

  1. Docker学习笔记【四】Docker 仓库

    访问仓库,仓库是集中从存放镜像的地方.类似Maven. Docker Hub 目前由Docker官方维护的一个公共仓库,其中包括15000的镜像. 注册 在 https://hub.docker.co ...

  2. django-debug-toolbar的配置以及使用

    django-debug-toolbar django,web开中,用django-debug-toolbar来调试请求的接口,无疑是完美至极.   可能本人,见识博浅,才说完美至极, 大神,表喷,抱 ...

  3. Python__flask初识

    1.  debug:在app.run()里面加上app.run(debug=True), 在浏览器中调试的时候可以直接显示出错误. 2.  在url中传递参数,可以这样 @app.route('/ch ...

  4. 每天几分钟跟小猫学前端之node系列:用node实现最简单的爬虫

    先来段求分小视频: https://www.iesdouyin.com/share/video/6550631947750608142/?region=CN&mid=6550632036246 ...

  5. HTML 5核心内容

    demo飞象 HTML 5 系列文章索引:http://www.cnblogs.com/webabcd/archive/2012/05/27/2520567.html demo飞象HTML 5 (11 ...

  6. profile bashrc bash_profile之间的区别和联系

    profile bashrc bash_profile之间的区别和联系 博客分类: Linux   执行顺序为:/etc/profile -> (~/.bash_profile | ~/.bas ...

  7. 在Redis Sentinel环境下,jedis该如何配置

    在Redis主从复制架构中,如果master出现了故障,则需要人工将slave提升为master,同时,通知应用侧更新master的地址.这样方式比较低效,对应用侧影响较大. 为了解决这个问题,Red ...

  8. 14 Live CDs for Penetration Testing (Pen Test) and Forensic

    http://www.ivizsecurity.com/blog/penetration-testing/live-cd-penetration-testing-pen/ Yesterday I wa ...

  9. Django单元测试简明实践

    1.准备数据模式,Django空库测试需要所有相关数据模式必须在Django中定义,说白了,model不能有managed=Fasle,为了解决这个问题,你必须得有一个managed全部为True的S ...

  10. Redis实现简单消息队列

    http://www.jianshu.com/p/9c04890615ba 任务异步化 打开浏览器,输入地址,按下回车,打开了页面.于是一个HTTP请求(request)就由客户端发送到服务器,服务器 ...