• poj 3735 Training little cats (矩阵快速幂)


    题目链接:

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

    题意:

    有n只猫咪,开始时每只猫咪有花生0颗,现有一组操作,由下面三个中的k个操作组成:
                   1. g i 给i只猫咪一颗花生米
                   2. e i 让第i只猫咪吃掉它拥有的所有花生米
                   3. s i j 将猫咪i与猫咪j的拥有的花生米交换

                   现将上述一组操作做m次后,问每只猫咪有多少颗花生?

    思路:

    http://www.cnblogs.com/acSzz/archive/2012/08/20/2648087.html

    代码:

      1 #include <iostream>
      2 #include <cstring>
      3 #include <algorithm>
      4 #include <cstdio>
      5 using namespace std;
      6 typedef long long ll;
      7 #define MS(a) memset(a,0,sizeof(a))
      8 #define MP make_pair
      9 #define PB push_back
     10 const int INF = 0x3f3f3f3f;
     11 const ll INFLL = 0x3f3f3f3f3f3f3f3fLL;
     12 inline ll read(){
     13     ll x=0,f=1;char ch=getchar();
     14     while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
     15     while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
     16     return x*f;
     17 }
     18 //////////////////////////////////////////////////////////////////////////
     19 const int maxn = 1e5+10;
     20 
     21 ll n,m,k;
     22 
     23 struct matrix{
     24     ll m[110][110];
     25     void clear(){
     26         MS(m);
     27     }
     28 }a;
     29 
     30 void init(){
     31     a.clear();
     32     for(int i=0; i<=n; i++)
     33         a.m[i][i] = 1;
     34 }
     35 
     36 matrix mul(matrix a,matrix b){
     37     matrix re;
     38     re.clear();
     39     for(int i=0; i<=n; i++){
     40         for(int k=0; k<=n; k++){
     41             if(a.m[i][k]){
     42                 for(int j=0; j<=n; j++){
     43                     re.m[i][j] = re.m[i][j]+a.m[i][k]*b.m[k][j];
     44                 }
     45             }
     46         }
     47     }
     48     return re;
     49 }
     50 
     51 matrix qpow(ll k){
     52     matrix e;
     53     e.clear();
     54     for(int i=0; i<=n; i++) e.m[i][i] = 1;
     55     while(k){
     56         if(k & 1) e = mul(e,a);
     57         a =  mul(a,a);
     58         k >>= 1;
     59     }
     60     return e;
     61 }
     62 
     63 int main(){
     64     while(cin>>n>>m>>k && (n+m+k)){
     65         init();
     66         for(int i=0; i<k; i++){
     67             char ch; scanf(" %c",&ch);
     68             if(ch == 'g'){
     69                 ll x = read();
     70                 a.m[0][x]++;
     71             }
     72             if(ch == 'e'){
     73                 ll x = read();
     74                 for(int j=0; j<=n; j++)
     75                     a.m[j][x] = 0;
     76             }
     77             if(ch == 's'){
     78                 ll x=read(),y=read();
     79                 if(x == y) continue;
     80                 for(int j=0; j<=n; j++)
     81                     swap(a.m[j][x],a.m[j][y]);
     82             }
     83         }
     84 
     85         if(m == 0){
     86             for(int i=0; i<n; i++)
     87                 if(i == 0) printf("0");
     88                 else printf(" 0");
     89             puts("");
     90             continue;
     91         }
     92 
     93         a = qpow(m);
     94 
     95         for(int i=1; i<=n; i++){
     96             if(i == 1) cout<<a.m[0][i];
     97             else cout<<" "<<a.m[0][i];
     98         }
     99         puts("");
    100     }
    101 
    102     return 0;
    103 }
  • 相关阅读:
    应用图标大小
    AndroidStudio使用笔记
    shell 三剑客之 sed 命令详解
    shell 三剑客之 sed pattern 详解
    shell 文本处理三剑客之 grep 和 egrep
    Shell 编程中的常用工具
    shell 函数的高级用法
    shell 数学运算
    shell 变量的高级用法
    nginx 之 https 证书配置
  • 原文地址:https://www.cnblogs.com/yxg123123/p/6837615.html
Copyright © 2020-2023  润新知