POJ3735——Training little cats

讲课的例题第二题,当时觉得好麻烦,然而写了下发现比其他的题都要短好多

坑点:
1、多组数据
2、矩阵要开到102*102
3、m=0的情况
这个。。有毒

思路就是暴力构造出矩阵,1~n代表标号为i的小猫剩余的花生数量

n+1就是1,用于g操作

然后暴力构造后直接快速幂即可

初始矩阵
0
0
0



1

CODE:

#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<queue>
#include<string>
#include<map>
#include<cstring>
#include<vector>
#define inf 1e9
#define ll long long
#define For(i,j,k) for(ll i=j;i<=k;i++)
#define Dow(i,j,k) for(ll i=k;i>=j;i--)
using namespace std;
ll n,m,q;
struct mat
{
    ll s_x,s_y;
    ll a[105][105];
    mat(){memset(a,0,sizeof a);}
};
mat mul(mat x,mat y)
{
    mat tmp;
    tmp.s_x=x.s_x;tmp.s_y=y.s_y;
    For(i,1,tmp.s_x)
        For(k,1,y.s_x)
            if(x.a[i][k])   
                For(j,1,tmp.s_y)
                    tmp.a[i][j]+=x.a[i][k]*y.a[k][j];
    return tmp;
}
mat ksm(mat x,ll y)
{
    mat tmp=x;y--;
    for(;y;y>>=1){if(y&1)tmp=mul(tmp,x);x=mul(x,x);}    return tmp;
}
int main()
{
    ios::sync_with_stdio(false);
    while(1)
    {
        cin>>n>>m>>q;
        if(n==0&&m==0&&q==0)    return 0;
        mat cube;
        cube.s_x=cube.s_y=n+1;
        For(i,1,n+1)    cube.a[i][i]=1;
        char c[5];
        For(k,1,q)
        {
            ll x,y;
            cin>>c;
            if(c[0]=='g')   
                cin>>x,cube.a[x][n+1]+=1;
            if(c[0]=='e')
            {
                cin>>x;
                For(i,1,n+1)    cube.a[x][i]=0;
            }
            if(c[0]=='s')
            {
                cin>>x>>y;
                For(i,1,n+1)    swap(cube.a[x][i],cube.a[y][i]);
            }
        }
        if(m==0)    {For(i,1,n) printf("0 ");puts("");continue;}
        if(m!=0)
            cube=ksm(cube,m);
        mat A;
        A.s_x=n+1;A.s_y=1;
        A.a[n+1][1]=1;
        A=mul(cube,A);
        For(i,1,n)  printf("%lld ",A.a[i][1]);
        puts("");
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值