Training little cats poj-3735

    题目大意:给你n个数,k个操作,将所有操作重复m次。

    注释:三种操作,将第i个盒子+1,交换两个盒子中的个数,将一个盒子清空。$1\le m \le 10^9$ , $1\le n , k \le 100$。

      想法:定义开始是的矩阵是n+1行,1列,除了最底下的数是1剩下全是0。然后加法操作就是讲操作答案矩阵的对应位置+1,交换操作就是暴力交换操作答案矩阵的两行,清空操作是将操作答案矩阵的对应行清零。

      至于最后的将所有操作重复,将单次操作答案矩阵快速幂即可。

    最后,附上丑陋的代码... ...

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define N 110
using namespace std;
struct Matr
{
int x,y;
int a[N][N];
Matr(){memset(a,0,sizeof a);}
Matr operator *(const Matr &z)
{
Matr re;
re.x=x;
re.y=z.y;
for(int i=1;i<=x;i++)
{
for(int j=1;j<=z.y;j++)
{
for(int k=1;k<=y;k++)
{
re.a[i][j]=(re.a[i][j]+a[i][k]*z.a[k][j]);
}
}
}
return re;
}
};
int n;
Matr quick_power(Matr &a,int k)
{
Matr x;
x.x=x.y=n+1;
for(int i=1;i<=n+1;i++)
{
x.a[i][i]=1;
}
Matr y=a;
while(k)
{
if(k&1) x=x*y;
y=y*y;
k>>=1;
}
return x;
}
int main()
{
while(1)
{
int k,m;
scanf("%d%d%d",&n,&m,&k);
if(!n&&!m&&!k) return 0;
if(m==0)
{
for(int i=1;i<=n;i++)
{
printf("0 ");
}
puts("");
continue;
}
Matr x;
x.x=x.y=n+1;
for(int i=1;i<=n+1;i++)
{
x.a[i][i]=1;
}
Matr ans=x;
// cout << k << "Fuck" << endl;
for(int i=1;i<=k;i++)
{
int number;
char s[20];
scanf("%s",s+1);
if(s[1]=='g')
{
scanf("%d",&number);
Matr a=x;
a.a[number][n+1]=1;
ans=ans*a;
// cout << i << endl;
}
if(s[1]=='e')
{
scanf("%d",&number);
for(int j=1;j<=n+1;j++)
{
ans.a[number][j]=0;
}
// ans=ans*a;
}
if(s[1]=='s')
{
int p,q;
scanf("%d%d",&p,&q);
// Matr a=x;
for(int j=1;j<=n+1;j++)
{
int middle=ans.a[q][j];
ans.a[q][j]=ans.a[p][j];
ans.a[p][j]=middle;
// swap(ans.a[p][j],ans.a[q][j]);
}
// ans=ans*a;
}
// puts("begin");
// for(int j=1;j<=n+1;j++)
// {
// for(int r=1;r<=n+1;r++)
// {
// cout << ans.a[j][r] << " " ;
// }
// puts("");
// }
// puts("end");
}
// if(m==0)
// {
// for(int i=1;i<=n;i++)
// {
// printf("0 ");
// }
// puts("");
// }
if(m!=1)
ans=quick_power(ans,m);
Matr ori;
ori.x=n+1;
ori.y=1;
ori.a[n+1][1]=1;
ans=ans*ori;
for(int i=1;i<=n;i++)
{
printf("%d ",ans.a[i][1]);
}
puts("");
// return 0;
}
}
// int main()
// {
// Matr a,b;
// a.x=a.y=b.x=b.y=3;
// for(int i=1;i<=3;i++)
// {
// a.a[i][i]=1;
// }
// a.a[2][3]=1;
// for(int i=1;i<=3;i++)
// {
// swap(a.a[1][i],a.a[2][i]);
// }
// for(int i=1;i<=3;i++)
// {
// for(int j=1;j<=3;j++)
// {
// cout << a.a[i][j] << " " ;
// }
// cout << endl ;
// }
// return 0;
// }

   小结:矩阵好写难调,用处不广泛,但是一些题有奇效(JLOI2018D2T2qwq)

[poj3735] Training little cats_矩乘快速幂的更多相关文章

  1. 2014 Super Training #10 G Nostop --矩阵快速幂

    原题: FZU 2173 http://acm.fzu.edu.cn/problem.php?pid=2173 一开始看到这个题毫无头绪,根本没想到是矩阵快速幂,其实看见k那么大,就应该想到用快速幂什 ...

  2. poj 3735 Training little cats(矩阵快速幂,模版更权威,这题数据很坑)

    题目 矩阵快速幂,这里的模版就是计算A^n的,A为矩阵. 之前的矩阵快速幂貌似还是个更通用一些. 下面的题目解释来自 我只想做一个努力的人 @@@请注意 ,单位矩阵最初构造 行和列都要是(猫咪数+1) ...

  3. HKE和他的小朋友(矩乘快速幂)

    题面: 题目背景: HKE带着\(n\)个小朋友做游戏 题目描述: 现在有n个座位编号为\(1\)至\(n\),这些小朋友也编号\(1\)至\(n\).一开始所有小朋友都坐在相应的座位上.HKE的游戏 ...

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

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

  5. HDU 6395 2018 Multi-University Training Contest 7 (快速幂+分块)

    原题地址 Sequence Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)T ...

  6. 【BZOJ-1009】GT考试 KMP+DP+矩阵乘法+快速幂

    1009: [HNOI2008]GT考试 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 2745  Solved: 1694[Submit][Statu ...

  7. BZOJ-1875 HH去散步 DP+矩阵乘法快速幂

    1875: [SDOI2009]HH去散步 Time Limit: 20 Sec Memory Limit: 64 MB Submit: 1196 Solved: 553 [Submit][Statu ...

  8. BZOJ-2326 数学作业 矩阵乘法快速幂+快速乘

    2326: [HNOI2011]数学作业 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 1564 Solved: 910 [Submit][Statu ...

  9. BZOJ-2875 随机数生成器 矩阵乘法快速幂+快速乘

    题目没给全,吃X了... 2875: [Noi2012]随机数生成器 Time Limit: 10 Sec Memory Limit: 512 MB Submit: 1479 Solved: 829 ...

随机推荐

  1. python中set元素为可迭代元素相加

    #a 与 b必须是两个相同类型的可迭代对象 a = "1" b = "2" print(set(a + b))  # {'1', '2'} a = " ...

  2. BZOJ 4304 tarjan+topsort+bitset

    我就是想骗一骗访问量 先Tarjan搞出来所有的强连通分量 正向连边 反向连边 topsort一发  搞出来每个点可以到哪些点 和哪些点可以到这个点 对于每条边 与一下  就是答案 //By Siri ...

  3. 题解报告:hdu 2647 Reward(拓扑排序)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2647 Problem Description Dandelion's uncle is a boss ...

  4. MySQL的安装和启动

    一.MySQL各类安装方法的比较 在Linux系统下,MySQL有3种主要的安装方式,分别是:RPM安装.二进制安装.源码安装.三种安装方式的优缺点如下表所示:   RPM安装 二进制安装 源码安装 ...

  5. UNIX环境高级编程--8. 进程控制

    进程控制进程标识:    每一个进程都有一个非负整型表示的唯一进程ID.虽然唯一,但是ID可以复用.当一个进程结束后,其进程ID会被延迟复用.    ID=0的进程通常是调度进程,常被称作交换进程(s ...

  6. [转]Linux定时任务Crontab详解

    转自:http://blog.chinaunix.net/uid-7552018-id-182133.html 今天做了个数据库的备份脚本,顺便系统得学习一下Linux下定时执行脚本的设置.Linux ...

  7. HDU3949 XOR(线性基第k小)

    Problem Description XOR is a kind of bit operator, we define that as follow: for two binary base num ...

  8. [转]Linux下/proc目录简介

    1. /proc目录Linux 内核提供了一种通过 /proc 文件系统,在运行时访问内核内部数据结构.改变内核设置的机制.proc文件系统是一个伪文件系统,它只存在内存当中,而不占用外存空间.它以文 ...

  9. Mongodb 重置密码或创建用户

    1.关闭mongodb  服务 win+r  输入services.msc 回车 找到MongoDB  关闭掉 2.进入到 win +r  输入cmd  进入命令窗口 在进入到mongodb 的安装目 ...

  10. Hive扩展功能(四)--HiveServer2服务

    软件环境: linux系统: CentOS6.7 Hadoop版本: 2.6.5 zookeeper版本: 3.4.8 主机配置: 一共m1, m2, m3这五部机, 每部主机的用户名都为centos ...