poj 3735 Training little cats(矩阵快速幂,模版更权威,这题数据很坑)
矩阵快速幂,这里的模版就是计算A^n的,A为矩阵。
之前的矩阵快速幂貌似还是个更通用一些。
下面的题目解释来自 我只想做一个努力的人
@@@请注意 ,单位矩阵最初构造 行和列都要是(猫咪数+1)!!!然后按照分析的来,分析中矩阵的下标都是从0开始的。
无法理解的可自行构造案例的矩阵进行验证。
注意一些细节,有些数据要用64位,不然会wa。
//可能是因为原本的模版不适用 #include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std; int num;
struct matrix
{
long long a[][];
}origin,answ; matrix multiply(matrix x,matrix y)//矩阵乘法
{
matrix temp;
memset(temp.a,,sizeof(temp.a));//因为后面的代码变了,所以这里也要初始化了
for(int i=;i<=num;i++)
{
for(int k=;k<=num;k++)
{
if(x.a[i][k])//据说多加这么一句筛选一下就不超时了?
{
for(int j=;j<=num;j++)
{
temp.a[i][j]+=((x.a[i][k]*y.a[k][j]));
}
}
}
}
return temp;
} matrix calc(matrix a,int n)//矩阵快速幂——a^n
{
if(n==)return a;
matrix e;
for(int i=;i<=num;i++)
for(int j=;j<=num;j++)
e.a[i][j]=(i==j); while(n)
{
if(n&)
e=multiply(e,a);
n>>=;
a=multiply(a,a);
}
return e;
} int main()
{ // freopen("in.txt", "r+", stdin);
// freopen("out.txt", "w+", stdout);
int n,k,m;
char s[];
while(scanf("%d%d%d",&n,&m,&k)!=EOF)
{
if(n==&&m==&&k==)break;
num=n;
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
origin.a[i][j]=(i==j); while(k--)
{
long long ii,jj;//这种数据也要64位
scanf("%s",s);
if(s[]=='g')
{
scanf("%lld",&ii);
origin.a[][ii]++;
}
else if(s[]=='s')
{
scanf("%lld%lld",&ii,&jj);
long long kk;
for(int iii=;iii<=n;iii++)
{
kk=origin.a[iii][ii];
origin.a[iii][ii]=origin.a[iii][jj];
origin.a[iii][jj]=kk;
}
}
else
{
scanf("%lld",&ii);
for(int iii=;iii<=n;iii++)
{
origin.a[iii][ii]=;
}
}
}
if(m==)//之前没考虑到这个?
memset(answ.a,,sizeof(answ.a));
else
answ=calc(origin,m);
int yi=;
for(int i=;i<=n;i++)
{
if(yi)
printf(" ");
printf("%lld",answ.a[][i]);
yi=;
}
puts("");
}
return ;
}
poj 3735 Training little cats(矩阵快速幂,模版更权威,这题数据很坑)的更多相关文章
- poj 3735 Training little cats 矩阵快速幂+稀疏矩阵乘法优化
题目链接 题意:有n个猫,开始的时候每个猫都没有坚果,进行k次操作,g x表示给第x个猫一个坚果,e x表示第x个猫吃掉所有坚果,s x y表示第x个猫和第y个猫交换所有坚果,将k次操作重复进行m轮, ...
- POJ 3735 Training little cats<矩阵快速幂/稀疏矩阵的优化>
Training little cats Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 13488 Accepted: ...
- POJ 3735 Training little cats 矩阵快速幂
http://poj.org/problem?id=3735 给定一串操作,要这个操作连续执行m次后,最后剩下的值. 记矩阵T为一次操作后的值,那么T^m就是执行m次的值了.(其实这个还不太理解,但是 ...
- poj 3753 Training little cats_矩阵快速幂
题意: 通过各种操作进行,给第i只猫花生,第i只猫吃光花生,第i只猫和第j只猫互换花生,问n次循环操作后结果是什么 很明显是构建个矩阵,然后矩阵相乘就好了 #include <iostream& ...
- 矩阵快速幂 POJ 3735 Training little cats
题目传送门 /* 题意:k次操作,g:i猫+1, e:i猫eat,s:swap 矩阵快速幂:写个转置矩阵,将k次操作写在第0行,定义A = {1,0, 0, 0...}除了第一个外其他是猫的初始值 自 ...
- poj 2888 Magic Bracelet(Polya+矩阵快速幂)
Magic Bracelet Time Limit: 2000MS Memory Limit: 131072K Total Submissions: 4990 Accepted: 1610 D ...
- Training little cats_矩阵快速幂
Description Facer's pet cat just gave birth to a brood of little cats. Having considered the health ...
- POJ 3233 Matrix Power Series 矩阵快速幂+二分求和
矩阵快速幂,请参照模板 http://www.cnblogs.com/pach/p/5978475.html 直接sum=A+A2+A3...+Ak这样累加肯定会超时,但是 sum=A+A2+...+ ...
- POJ 3233 Matrix Power Series 矩阵快速幂
设S[k] = A + A^2 +````+A^k. 设矩阵T = A[1] 0 E E 这里的E为n*n单位方阵,0为n*n方阵 令A[k] = A ^ k 矩阵B[k] = A[k+1] S[k] ...
随机推荐
- Java中的哈希
Java中的哈希 前言 在开发中经常用到HashMap.HashSet等与哈希有关的数据结构,一直只知道这些哈希的数据结构不保证顺序,不清楚具体什么情况.所以在这里大致总结一下. Java的Has ...
- 《通过脚本查看哪些ip被占用》shell笔记
改脚本查看哪些ip被占用. #!/bin/bash for i in {1..10} //赋予i变量1-10 do //干什么 ping -c1 -w1 192.168.7.$i && ...
- wordpress忘记密码重置
一直使用浏览器记录密码的方式登陆wordpress,直到有一天重装系统,而浏览器的记录又没有备份,结果怎么也想不起当初所设定的密码了…… -_-||| 遂google了一番,发现了直接修改数据库重设密 ...
- Java中String类型的不可变性和驻留池
一 基本概念 可变类和不可变类(Mutable and Immutable Objects)的初步定义: 可变类:当获得这个类的一个实例引用时,可以改变这个实例的内容. 不可变类:不可变类的实例一但创 ...
- Delphi XE5教程9:基本语法元素
内容源自Delphi XE5 UPDATE 2官方帮助<Delphi Reference>,本人水平有限,欢迎各位高人修正相关错误!也欢迎各位加入到Delphi学习资料汉化中来,有兴趣者可 ...
- grappelli美化django的admin页面
开始用admin时候,觉得它的页面实在...宁愿自己写modules,多费点时间 grappelli可以把admin变得非常美观,配置起来也很简单 第一步,先下载grappelli,搜索一下,wind ...
- (转)Android Support Percent百分比布局
一.概述 周末游戏打得过猛,于是周天熬夜码代码,周一早上浑浑噩噩的发现 android-percent-support-lib-sample(https://github.com/JulienGeno ...
- 【译】Android系统简介
简介 本文主要介绍Android的基础知识和体系结构,本文主题: 简介什么是Android,为什么开发者需要关注Android: Android体系结构(如Linux Kernel, Librari ...
- linux终端io笔记
简介 终端的两种工作模式:以行为单位的工作模式,以字符数或时间为单位自定义模式 终端判断函数: int isatty(int fd) 终端属性的获取与设置: int tcgetattr(int fd, ...
- BootLoader作用
BootLoader 是系统加电后运行的第一段代码.一般它只在系统启动时非常短的时间内运行. 由OS Loader负责将所要引导的操作系统的内核映象从硬盘上读到系统RAM中,然后跳转到内核的入口点上. ...