[poj3735] Training little cats_矩乘快速幂
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_矩乘快速幂的更多相关文章
- 2014 Super Training #10 G Nostop --矩阵快速幂
原题: FZU 2173 http://acm.fzu.edu.cn/problem.php?pid=2173 一开始看到这个题毫无头绪,根本没想到是矩阵快速幂,其实看见k那么大,就应该想到用快速幂什 ...
- poj 3735 Training little cats(矩阵快速幂,模版更权威,这题数据很坑)
题目 矩阵快速幂,这里的模版就是计算A^n的,A为矩阵. 之前的矩阵快速幂貌似还是个更通用一些. 下面的题目解释来自 我只想做一个努力的人 @@@请注意 ,单位矩阵最初构造 行和列都要是(猫咪数+1) ...
- HKE和他的小朋友(矩乘快速幂)
题面: 题目背景: HKE带着\(n\)个小朋友做游戏 题目描述: 现在有n个座位编号为\(1\)至\(n\),这些小朋友也编号\(1\)至\(n\).一开始所有小朋友都坐在相应的座位上.HKE的游戏 ...
- POJ 3735 Training little cats(矩阵快速幂)
Training little cats Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 11787 Accepted: 2892 ...
- HDU 6395 2018 Multi-University Training Contest 7 (快速幂+分块)
原题地址 Sequence Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others)T ...
- 【BZOJ-1009】GT考试 KMP+DP+矩阵乘法+快速幂
1009: [HNOI2008]GT考试 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 2745 Solved: 1694[Submit][Statu ...
- BZOJ-1875 HH去散步 DP+矩阵乘法快速幂
1875: [SDOI2009]HH去散步 Time Limit: 20 Sec Memory Limit: 64 MB Submit: 1196 Solved: 553 [Submit][Statu ...
- BZOJ-2326 数学作业 矩阵乘法快速幂+快速乘
2326: [HNOI2011]数学作业 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 1564 Solved: 910 [Submit][Statu ...
- BZOJ-2875 随机数生成器 矩阵乘法快速幂+快速乘
题目没给全,吃X了... 2875: [Noi2012]随机数生成器 Time Limit: 10 Sec Memory Limit: 512 MB Submit: 1479 Solved: 829 ...
随机推荐
- mysql sql执行错误#1436 Thread stack overrun
1.mysql调用存储过程 call proc1() 时报错:Thread stack overrun: 6656 bytes used of a 8496 byte stack, and 1280 ...
- [Apple开发者帐户帮助]九、参考(3)支持的功能(iOS)
iOS应用程序可用的功能取决于您的程序成员身份. 能力 ADP 企业 Apple开发者 访问Wifi信息 应用程序组 Apple Pay 相关域名 自动填充凭据提供程序 背景模式 ...
- [Swift通天遁地]八、媒体与动画-(14)使用TextKit快速实现文章的分栏效果
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...
- 面试说熟练掌握各种MQ?那你先看看这道题,面试官必问!
写在前面 我们知道,目前市面上的MQ包括Kafka.RabbitMQ.ZeroMQ.RocketMQ等等. 那么他们之间究竟有什么本质区别,分别适用于什么场景呢? 上述抛出的问题,同样在不少公司的Ja ...
- Sublime Text Version 3.0,Build3143注册码
1.打开sublime text软件2.Help->Enter License3.复制以下BEGIN LICENSE和END LICENSE之间的部分,粘贴进去.(注意:不要复制BEGIN LI ...
- phonegap在eclipse上的安装
1.首先安装好eclipse 2.下载安装好sdk 3.下载安装好adt 4.在这个地方下载好phonegap的包,https://codeload.github.com/phonegap/phone ...
- B树、B+树、红黑树、AVL树比较
B树是为了提高磁盘或外部存储设备查找效率而产生的一种多路平衡查找树. B+树为B树的变形结构,用于大多数数据库或文件系统的存储而设计. B树相对于红黑树的区别 在大规模数据存储的时候,红黑树往往出现由 ...
- [ NOIP 1998 ] TG
\(\\\) \(\#A\) 车站 火车从第\(1\)站开出,上车的人数为\(a\),然后到达第\(2\)站,在第\(2\)站有人上.下车,但上.下车的人数相同,因此在第\(2\)站开出时(即在到达第 ...
- JS高级——扩展内置对象的方法
基本概念 内置对象有很多,几个比较重要的:Math.String.Date.Array 基本使用 1.内置对象创建出来的对象使用的方法使用的其实都是内置对象的原型对象中的方法 (1)a并没有charA ...
- CSS——border
表格细线: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF ...