题目链接: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. [k8s]metricbeat的kubernetes模块&kube-metric模块

    正确姿势启动metricbeat metricbeat.modules: - module: system metricsets: - cpu - filesystem - memory - netw ...

  2. 相似微信的ChattingUi

    先看主页面布局 activity_imitate_weixin_main.xml <RelativeLayout xmlns:android="http://schemas.andro ...

  3. KVM部署LVS集群故障案例一则

    一.故障现象 KVM部署LVS(Linux Virtual Server)集群后,能够单独以HTTP方式访问RS(Real Server)的实际IP,但无法通过VIP(Virtual IP)访问. 二 ...

  4. HashMap原理<转>

    1. HashMap的数据结构 数据结构中有数组和链表来实现对数据的存储,但这两者基本上是两个极端. 数组 数组存储区间是连续的,占用内存严重,故空间复杂的很大.但数组的二分查找时间复杂度小,为O(1 ...

  5. 逻辑斯特回归(logistic regression)与最大熵模型(maximum entropy model)

  6. jQuery补充,模拟图片放大镜

    jQuery补充,模拟图片放大镜 html <!DOCTYPE html> <html lang="en"> <head> <meta c ...

  7. JVM与外界通过数据通道进行数据交换

    使用I/O流访问file中的内容. JVM与外界通过数据通道进行数据交换. 分类: 按流分为输入流和输出流: 按传输单位分为字节流和字符流: 还可以分为节点流和过滤流. 节点流:负责数据源和程序之间建 ...

  8. 【BZOJ】1676: [Usaco2005 Feb]Feed Accounting 饲料计算(差分)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1676 太水的一题了.. 差分直接搞. #include <cstdio> #includ ...

  9. hdu 1086:You can Solve a Geometry Problem too(计算几何,判断两线段相交,水题)

    You can Solve a Geometry Problem too Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/3 ...

  10. Android5.0新特性-Material Design

    概述 2014年,Google携Android5.X重装归来.全新的UI设计和更加优化的性能,令开发人员眼前一亮 安装和配置Android5.0开发环境 开发Android还得靠AS.下载地址 htt ...