题目:Training little cats

链接:http://poj.org/problem?id=3735

分析:

1)将操作用矩阵表示出来,然后快速幂优化。

2)初始矩阵:$ \left[ \begin{array}{ccccc} 1 & a_1 & a_2 & ... & a_n \end{array} \right] $

构造一个$ (n+1)*(n+1) $ 的单位矩阵T。

得花生:将第0行中得到花生的那一列赋为1.

$ \left[ \begin{array}{cccccc} 1 & 0 & ... & [1] & ... & 0 \\ 0 & 1 & ... & 0 & ... & 0 \\ ... & ... & ... & ... & ... & ... \\ 0 & 0 & ... & 0 & ... & 1 \end{array} \right] $

吃花生:将第得到花生的那一行那一列的元素赋为0;

$ \left[ \begin{array}{cccccc} 1 & 0 & ... & 0 & ... & 0 \\ 0 & 1 & ... & 0 & ... & 0 \\ ... & ... & ... & ... & ... & ... \\ 0 & 0 & ... & [0] & ... & 0 \\ ... & ... & ... & ... & ... & ... \\ 0 & 0 & ... & 0 & ... & 1 \end{array} \right] $

交换花生:就是交换两行,就是初等行变化。

$ \left[ \begin{array}{cccccc} 1 & 0 & ... & 0 & ... & 0 \\ ... & ... & ... & ... & ... & ... \\ ... & ... & 0 & ... & [1] & ... \\ ... & ... & ... & ... & ... & ... \\ ... & ... & [1] & ... & 0 & ... \\ ... & ... & ... & ... & ... & ... \\ 0 & 0 & ... & 0 & ... & 1 \end{array} \right] $

3)T不停累乘操作矩阵,最后得到这一组的组操作矩阵。

4)快速幂求T^n,然后第一行就是答案。

5)注意longlong,虽然只有$10^9$次组操作,但每组操作都是100个得花生,还都给一只猫,就爆int了。

#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
typedef long long LL;
struct Matrix{
int n;
LL a[][];
void init(int _n,int f,int p=,int pp=){
n=_n;
memset(a,,sizeof a);
if(f==-)return;
for(int i=;i<=n;++i)a[i][i]=;
if(f==)a[][p]=;
if(f==)a[p][p]=;
if(f==){
a[p][p]=a[pp][pp]=;
a[p][pp]=a[pp][p]=;
}
}
};
Matrix operator*(Matrix& A,Matrix& B){
Matrix C;C.init(A.n,-);
for(int k=,n=C.n;k<=n;++k)
for(int i=;i<=n;++i)if(A.a[i][k])
for(int j=;j<=n;++j)
C.a[i][j]+=A.a[i][k]*B.a[k][j];
return C;
}
Matrix operator^(Matrix A,int n){
Matrix Rt;Rt.init(A.n,);
for(;n;n>>=){
if(n&)Rt=Rt*A;
A=A*A;
}
return Rt;
}
int main(){
int n,m,k,p,pp;char ch[];
Matrix T,T1;
for(;scanf("%d%d%d",&n,&m,&k);){
if(n== && m== && k==)break;
T.init(n,);
for(int i=;i<=k;++i){
scanf("%s",ch);
switch(ch[]){
case 'g':scanf("%d",&p);T1.init(n,,p);break;
case 'e':scanf("%d",&p);T1.init(n,,p);break;
case 's':scanf("%d%d",&p,&pp);T1.init(n,,p,pp);
}
T=T*T1;
}
T=T^m;
for(int i=;i<=n;++i)printf("%lld ",T.a[][i]);
puts("");
}
return ;
}

6)可以直接把初始矩阵的效果叠加到T上面

#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
typedef long long LL;
struct Matrix{
int n;
LL a[][];
void init(int _n,int f){
n=_n;
memset(a,,sizeof a);
if(f==-)return;
for(int i=;i<=n;++i)a[i][i]=;
}
};
Matrix operator*(Matrix& A,Matrix& B){
Matrix C;C.init(A.n,-);
for(int k=,n=C.n;k<=n;++k)
for(int i=;i<=n;++i)if(A.a[i][k])
for(int j=;j<=n;++j)
C.a[i][j]+=A.a[i][k]*B.a[k][j];
return C;
}
Matrix operator^(Matrix A,int n){
Matrix Rt;Rt.init(A.n,);
for(;n;n>>=){
if(n&)Rt=Rt*A;
A=A*A;
}
return Rt;
}
int main(){
int n,m,k,p,pp;char ch[];
Matrix T;
for(;scanf("%d%d%d",&n,&m,&k);){
if(n== && m== && k==)break;
T.init(n,);
for(int i=;i<=k;++i){
scanf("%s",ch);
switch(ch[]){
case 'g':scanf("%d",&p);++T.a[][p];break;
case 'e':scanf("%d",&p);
for(int i=;i<=n;++i)T.a[i][p]=;
break;
case 's':scanf("%d%d",&p,&pp);
for(int i=;i<=n;++i)swap(T.a[i][p],T.a[i][pp]);
}
}
T=T^m;
for(int i=;i<=n;++i)printf("%lld ",T.a[][i]);
puts("");
}
return ;
}

[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(特殊操作转化为矩阵操作)

    题目链接:http://poj.org/problem?id=3735 题目意思: 调教猫咪:有n只饥渴的猫咪,现有一组羞耻连续操作,由k个操作组成,全部选自: 1. g i 给第i只猫咪一颗花生 2 ...

  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. Nginx 模块 - ngx_core_module

    原文地址 示例配置 指令 accept_mutex accept_mutex_delay daemon debug_connection debug_points env error_log even ...

  2. HTML 解析类库HtmlAgilityPack

    1. HtmlAgilityPack简介 网站中首先遇到的问题是爬虫和解析HTML的问题,一般情况在获取页面少量信息的情况下,我们可以使用正则来精确匹配目标.不过本身正则表达式就比较复杂,同时正则表达 ...

  3. Redux生态系统

    生态系统 Redux 是一个体小精悍的库,但它相关的内容和 API 都是精挑细选的,足以衍生出丰富的工具集和可扩展的生态系统. 如果需要关于 Redux 所有内容的列表,推荐移步至 Awesome R ...

  4. Cordova指令

      安装 cordova: npm install -g cordova 创建应用程序 cordova create hello com.example.hello HelloWorld cordov ...

  5. 京东商品评论的分类预测与LSA、LDA建模

    (一)数据准备 1.爬取京东自营店kindle阅读器的评价数据,对数据进行预处理,使用机器学习算法对评价文本进行舆情分析,预测某用户对本商品的评价是好评还是差评.通过数据分析与模型分析,推测出不同型号 ...

  6. React后台管理手动封装图片上传组件

    分为两个文件夹,index.js(逻辑文件) styled.js(样式文件) index.js文件,编写完成之后在对应的地方引入即可 import React from "react&quo ...

  7. php和java的优势

    现在市场上的电子商务软件基本上可归结为两大阵营,即PHP阵营和Java阵营.但对接触电子商务不久的用户来说,看到的往往只是它们的表相,只是明显的价格差异,却很难看出它们之间的实际差异.下面我们就为大家 ...

  8. 【五一qbxt】day7-1 引水入城

    [noip2010 洛谷p1514]引水入城 Before: 线段覆盖问题#1:(我们所需要的) 一个区间,若干条线段,现在求最少多少条线段覆盖满整个区间 区间长度8,可选的覆盖线段[2,6],[1, ...

  9. [暑假集训Day1T1]黑暗城堡

    因为D[i]表示i号节点到1号节点的最短路径,所以可以先以1为源点跑一边SPFA,预处理出每个点到1号节点的最短路.之后开始考虑所谓的“最短路径生成树”,在这棵生成树中有以下性质:当fa[i]==no ...

  10. Ubuntu login as root automatically

    vim /etc/lightdm/lightdm.conf Finally, edit the file as shown below and save it. autologin-user=< ...