| Time Limit: 2000MS | Memory Limit: 65536K | |
| Total Submissions: 10593 | Accepted: 2532 |
Description
Facer's pet cat just gave birth to a brood of little cats. Having considered the health of those lovely cats, Facer decides to make the cats to do some exercises. Facer has well designed a set of moves for his cats. He is now asking you to supervise the cats to do his exercises. Facer's great exercise for cats contains three different moves:
g i : Let the ith cat take a peanut.
e i : Let the ith cat eat all peanuts it have.
s i j : Let the ith cat and jth cat exchange their peanuts.
All the cats perform a sequence of these moves and must repeat it m times! Poor cats! Only Facer can come up with such embarrassing idea.
You have to determine the final number of peanuts each cat have, and directly give them the exact quantity in order to save them.
Input
The input file consists of multiple test cases, ending with three zeroes "0 0 0". For each test case, three integers n, m and k are given firstly, where n is the number of cats and k is the length of the move sequence. The following k lines describe the sequence.
(m≤1,000,000,000, n≤100, k≤100)
Output
For each test case, output n numbers in a single line, representing the numbers of peanuts the cats have.
Sample Input
3 1 6 g 1 g 2 g 2 s 1 2 g 3 e 2 0 0 0
Sample Output
2 0 1
Source
题目链接:http://poj.org/problem?id=3735
题目大意:n只猫,k个序列
g i表示第i只猫得到一个花生
e i表示第i只猫吃掉所有花生
s i j表示第i只猫和第j只猫交换花生
k个序列要被重复m次,问最后每只猫有多少花生
题目分析:典型的矩阵快速幂问题,先构造单位矩阵
g i: 1 0 0 0 让第n+1列第i行加1 如若i = 1 1 0 0 1 x x + 1
0 1 0 0 0 1 0 0 y = y
0 0 1 0 0 0 1 0 z z
0 0 0 1 0 0 0 1 1 1
e i: 将矩阵第i行全部清0即可
s i j:交换当前矩阵的第i行和第j行即可
矩阵求出来,再走一个快速幂就好了
#include <cstdio>
#include <cstring>
#define ll long long
struct matrix
{
ll m[105][105];
}a;
int n, k;
ll m;
matrix multiply(matrix x, matrix y)
{
matrix ans;
memset(ans.m, 0, sizeof(ans.m));
for(int i = 1; i <= n; i++)
for(int j = 1; j <= n; j++)
if(x.m[i][j])
for(int k = 1; k <= n; k++)
ans.m[i][k] = (ans.m[i][k] + x.m[i][j] * y.m[j][k]);
return ans;
}
matrix quickmod(int p)
{
matrix ans;
memset(ans.m, 0, sizeof(ans.m));
for(int i = 1; i <= n; i++)
ans.m[i][i] = 1;
while(p)
{
if(p & 1)
ans = multiply(ans, a);
p >>= 1;
a = multiply(a, a);
}
return ans;
}
int main()
{
while(scanf("%d %lld %d", &n, &m, &k) != EOF && (n + m + k))
{
n++;
char s[10];
int x, y;
memset(a.m, 0, sizeof(a.m));
for(int i = 1; i <= n; i++)
a.m[i][i] = 1;
for(int i = 0; i < k; i++)
{
scanf("%s", s);
if(s[0] == 'g')
{
scanf("%d", &x);
a.m[x][n]++;
}
if(s[0] == 'e')
{
scanf("%d", &x);
for(int j = 1; j <= n; j++)
a.m[x][j] = 0;
}
if(s[0] == 's')
{
scanf("%d %d", &x, &y);
for(int j = 1; j <= n; j++)
{
ll tmp = a.m[x][j];
a.m[x][j] = a.m[y][j];
a.m[y][j] = tmp;
}
}
}
matrix ans = quickmod(m);
for(int i = 1; i < n; i++)
printf("%lld ", ans.m[i][n]);
printf("\n");
}
}

本文概述了AI音视频处理领域的关键技术,包括视频分割、语义识别、自动驾驶、AR、SLAM等,并探讨了其在实际应用中的作用。
7445

被折叠的 条评论
为什么被折叠?



