题目链接:http://poj.org/problem?id=3735

题目意思:

调教猫咪:有n只饥渴的猫咪,现有一组羞耻连续操作,由k个操作组成,全部选自:

1. g i 给第i只猫咪一颗花生

2. e i 让第i只猫咪吃光它的花生

3. s i j 交换猫咪i与猫咪j的花生

现将上述一组连续操作做m次后,求每只猫咪有多少颗花生?

思路:这道题难点在如何把这种奇怪的操作转化为矩阵操作,网络上看到一个画的很好的图,这里直接偷过来。

现在,对于每一个操作我们都可以得到一个转置矩阵,把k个操作的矩阵相乘我们可以得到一个新的转置矩阵T。A * T 表示我们经过一组操作,类似我们可以得到经过m组操作的矩阵为 A * T ^ m,最终矩阵的[0][1~n]即为答案。

上述的做法比较直观,但是实现过于麻烦,因为要构造k个不同矩阵。有没有别的方法可以直接构造转置矩阵T?答案是肯定的。

我们还是以单位矩阵为基础:

对于第一种操作g i,我们使Mat[0][i] = Mat[0][i] + 1
对于第二种操作e i,我们使矩阵的第i列清零;
对于第三种操作s i j,我们使第i列与第j列互换。
这样实现的话,我们始终在处理一个矩阵,免去构造k个矩阵的麻烦。
至此,构造转置矩阵T就完成了,接下来只需用矩阵快速幂求出 A * T ^ m即可,还有一个注意的地方,该题需要用到long long。

这里还要说一下T*A=A*T的转置。

代码:

  1. //Author: xiaowuga
  2. #include<iostream>
  3. #include<algorithm>
  4. #include<cstring>
  5. #define maxx INT_MAX
  6. #define minn INT_MIN
  7. #define inf 0x3f3f3f3f
  8. #define N 105
  9. using namespace std;
  10. typedef long long ll;
  11. ll n,size;//第n项,矩阵大小
  12. struct Matrix{
  13. ll mat[N][N];
  14. void clear(){
  15. memset(mat,,sizeof(mat));
  16. }
  17. Matrix operator * (const Matrix & m) const{
  18. Matrix tmp;
  19. int i ,j,k;
  20. tmp.clear();
  21. for( i=;i<size;i++)
  22. for( k=;k<size;k++){
  23. if(mat[i][k]==) continue;
  24. for( j=;j<size;j++){
  25. tmp.mat[i][j]+=mat[i][k]*m.mat[k][j];
  26. }
  27. }
  28. return tmp;
  29. }
  30. };
  31. void POW(Matrix m,ll k){
  32. Matrix ans;
  33. memset(ans.mat,,sizeof(ans.mat));
  34. for(int i=;i<size;i++) ans.mat[i][i]=;
  35. while(k){
  36. if(k&) ans=ans*m;
  37. k/=;
  38. m=m*m;
  39. }
  40. for(int i=;i<size;i++){
  41. cout<<ans.mat[][i]<<" ";
  42. }
  43. cout<<endl;
  44. }
  45. int main() {
  46. Matrix m;
  47. int k;
  48. while(cin>>size>>n>>k&&(size+n+k)){
  49. size++;
  50. m.clear();
  51. for(int i=;i<size;i++) m.mat[i][i]=;
  52. for(int i=;i<k;i++){
  53. char t[];
  54. int num1,num2;
  55. cin>>t;
  56. if(t[]=='g'){
  57. cin>>num1;
  58. m.mat[][num1]++;
  59. }
  60. else if(t[]=='e'){
  61. cin>>num1;
  62. for(int j=;j<size;j++){
  63. m.mat[j][num1]=;
  64. }
  65. }
  66. else{
  67. cin>>num1>>num2;
  68. for(int j=;j<size;j++)
  69. swap(m.mat[j][num1],m.mat[j][num2]);
  70. }
  71. }
  72. POW(m,n);
  73. }
  74. return ;
  75. }

poj3735—Training little cats(特殊操作转化为矩阵操作)的更多相关文章

  1. xiaowuga poj3735—Training little cats(特殊操作转化为矩阵操作)

    题意:有n只猫,对其进行k次操作,然后反复这样操作m次. 其中g 表示 i 猫加1, e表示 i 猫为0:s表示  i 与 j 猫互换. 解释一下样例: 3 1 6g 1g 2g 2s 1 2g 3e ...

  2. [POJ3735]Training little cats

    题目:Training little cats 链接:http://poj.org/problem?id=3735 分析: 1)将操作用矩阵表示出来,然后快速幂优化. 2)初始矩阵:$ \left[ ...

  3. Training little cats poj3735

    Training little cats Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 9299   Accepted: 2 ...

  4. Training little cats(poj3735,矩阵快速幂)

    Training little cats Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 10737   Accepted:  ...

  5. [poj3735] Training little cats_矩乘快速幂

    Training little cats poj-3735 题目大意:给你n个数,k个操作,将所有操作重复m次. 注释:三种操作,将第i个盒子+1,交换两个盒子中的个数,将一个盒子清空.$1\le m ...

  6. 矩阵快速幂 POJ 3735 Training little cats

    题目传送门 /* 题意:k次操作,g:i猫+1, e:i猫eat,s:swap 矩阵快速幂:写个转置矩阵,将k次操作写在第0行,定义A = {1,0, 0, 0...}除了第一个外其他是猫的初始值 自 ...

  7. [POJ 3735] Training little cats (结构矩阵、矩阵高速功率)

    Training little cats Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 9613   Accepted: 2 ...

  8. POJ 3735 Training little cats<矩阵快速幂/稀疏矩阵的优化>

    Training little cats Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 13488   Accepted:  ...

  9. POJ 3735 Training little cats(矩阵快速幂)

    Training little cats Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 11787 Accepted: 2892 ...

随机推荐

  1. 【Android】13.3 使用SQLite.NET-PCL访问SQLite数据库

    分类:C#.Android.VS2015: 创建日期:2016-02-26 一.简介 本章开头已经说过了,SQLite.NET-PCL用起来很爽,这一节咱们看看怎样使用吧. 二.示例3运行截图 下面左 ...

  2. C/C++:C++伪函数

    C++伪函数: 所谓的伪函数.就是说它不是一个真正的函数,而是一个类或者说是一个结构体. <span style="font-size:18px;"> #include ...

  3. Angular+Electron+VSCode的桌面应用

    Angular+Electron+VSCode的桌面应用 转自:http://blog.csdn.net/yr7942793/article/details/50986696 第一部分 Electro ...

  4. xadmin 问题总结

    pip install django-import-export

  5. PyCharm 在django程序中单独运行py文件

    使用PyCharm开发django程序,发现如果不在命令行而在IDE的django项目中直接运行django程序,发现报错,程序如下:   def main(): from people.models ...

  6. poj3261(后缀数组)

    题意:给出一串长度为n的字符,再给出一个k值,要你求重复次数大于等于k次的最长子串长度........ 思路:其实也非常简单,直接求出height值,然后将它分组,二分答案......结果就出来了.. ...

  7. nginx解析漏洞

    一个比较老的漏洞了,但是今天在一个交流群里大佬们有那么一个案例.就深入学习了一下其原理. Nginx当检查url最后的文件名为脚本的时候,他就会把整个程序当作脚本来执行,否则就当作非脚本执行. 正确上 ...

  8. MapReduce程序的工作过程

    转自:http://www.aboutyun.com/thread-15494-1-2.html 问题导读1.HDFS框架组成是什么?2.HDFS文件的读写过程是什么?3.MapReduce框架组成是 ...

  9. getRequestDispatcher 和sendRedirect区别及路径问题

    getRequestDispatcher 和sendRedirect区别   getRequestDispatcher是服务器内部跳转,地址栏信息不变,只能跳转到web应用内的网页. sendRedi ...

  10. php -- 魔术方法 之 判断属性是否存在或为空:__isset()

    属性重载:当访问一个不存在或者权限不够的属性的时候,能够触发一系列的魔术方法,就叫做属性重载 __isset($name):当使用 isset()函数或者empty()函数 判断属性是否存在或者是否为 ...