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)

    一.插入排序 介绍 插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的.个数加一的有序数据.      算法适用于少量数据的排序,时间复杂度为O(n^2).      插入 ...

  2. [App Store Connect帮助]三、管理 App 和版本(2.7)输入 App 信息:添加 iMessage 信息版 App 的 App 信息

    您可以使用 Messages framework(Messages 框架)来创建贴纸包或 iMessage 信息版 App(可在 iMessage App Store 中获取).可作为独立 App,也 ...

  3. Vue Router的params和query传参的使用和区别

    vue页面跳转有两种方式分别是:name和path this.$router.push({name: 'HelloWorld2}) this.$router.push({path: '/hello-w ...

  4. $P2126 Mzc家中的男家丁$

    problem #ifdef Dubug #endif #include <bits/stdc++.h> using namespace std; typedef long long LL ...

  5. python--修改默认递归层级

    import sys sys.setrecursionlimit(最大递归次数)

  6. HTML 表格与表单 个人简历

    <title>个人简历</title></head> <body background="1e30e924b899a9015b946ac41f950 ...

  7. 我正在学英语是用learning english还是用studying english?

    学一门语言用 learn. study 表示深入研究,一般指在大学里.如果大学里的专业是英语,就可以说 study English. 1. If you study hard, you will le ...

  8. Python学习(一)-在VS上搭建开发环境

    1.到官网下载最新Python 注意:虽然目前大部分应用是Python2写的,但Python3必定会成为以后的主流 不管选择学习哪个,了解pyhton2和pyhton3的差异是必须的 2.安装Pyth ...

  9. 对“空引用”说bye-bye

    大家可能经常遇到这种情况:当一个对象为null时,调用这个对象的方法或者属性时,就会报错:“Object reference not set to an instance of an object.” ...

  10. Android的HttpUrlConnection类的GET和POST请求

    /** * get方法使用 */ private void httpGet() { new Thread() { @Override public void run() { //此处的LOGIN是请求 ...