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. NET运用String的十八层境界

    古往今来,文本处理一直是所有编程语言的最基础的功能,也是最核心最重要的功能.任何初学者,如果想学一门编程语言,都要面对大量的文本处理.而或许有一天,即使你成了大师级的人物,也不敢说自己驾驭文本处理的能 ...

  2. P2085最小函数值(优先队列)

    P2085 最小函数值(minval) 题目描述 有n个函数,分别为F1,F2,...,Fn.定义Fi(x)=Ai*x^2+Bi*x+Ci (x∈N*).给定这些Ai.Bi和Ci,请求出所有函数的所有 ...

  3. A Few Words on Callbacks and Asynchronous Mechanism In Javascript

    It is said that the one of the most routine work a javascript programmer do is writing codes like &q ...

  4. vue-resource 拦截器的使用

    园友参考  https://www.cnblogs.com/lhl66/p/8022823.html vue-resource 拦截器使用在vue项目使用vue-resource的过程中,临时增加了一 ...

  5. 高德,百度,Google地图定位偏移以及坐标系转换

    一.在进行地图开发过程中,我们一般能接触到以下三种类型的地图坐标系: 1.WGS-84原始坐标系 一般用国际GPS纪录仪记录下来的经纬度,通过GPS定位拿到的原始经纬度,Google和高德地图定位的的 ...

  6. python自动化测试学习笔记-6urllib模块&request模块

    python3的urllib 模块提供了获取页面的功能. urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, capat ...

  7. 解决gradle project refresh failed: protocol family unavailable问题的几种方法

    Android Studio从版本1.5更新到2.1之后,打开Android Studio一直提示: gradle project refresh failed: protocol family un ...

  8. webHttpBinding+wsHttpBinding+basicHttpBinding的区别 (转)

    1. webHttpBinding (web AJAX/JSON)2. wsHttpBinding (ASP.NET client) 3. basicHttpBinding (Silverlight) ...

  9. PHP 在线 编辑 解析

    http://www.w3schools.com/php/default.asp    http://www.w3schools.com/php/showphp.asp?filename=demo_s ...

  10. 启用禁用USB接口

    一个小工具,功能有启用禁用外网.USB接口,可由服务端socket长链接进行操控客户端从而达到实现前边的这些功能,这里贴上核心代码,先给上启用禁用USB接口吧,这个方法可随时启用禁用,之前用过一个改u ...