poj 3735 大数量重复操作问题(矩阵快速幂)

题意:一个一维数组,3种操作: a:  第i个数+1,b: 第i个数=0 ,c::交换某俩处的数。  由三种基本操作构成一组序列,重复该序列m次(m<10^9),问结果

属于一种综合操作重复型: 每次乘以一矩阵T,相当于做一次操作。关键是构造这个矩阵。

先构造最初矩阵A :  1*(n +1) ={1,0,0,0...} ,  第一个一时为了操作第一行数的,

T的构造:初始是N+1 * N+1单位阵 这样恰好操作第i个数, +1,就在第0行的第 i个加1;交换就对应列交换,清零就对应列清0.

ans= A*(T^m); 注意用;long long

#include<iostream>
#include<cstring>
using namespace std;
struct juz
{
    long long  bat[105][105];
    int x,y;     //行 列
    juz ()
    {
        memset(bat,0,sizeof(bat));
        x=0;y=0;
    }
};
juz mutp(juz a,juz b)
{
    juz c;
    c.x=a.x;c.y=b.y;
    memset(c.bat,0,sizeof(c.bat));
    for(int k=0;k<a.y;k++)
          for(int i=0;i<a.x;i++)
          if(a.bat[i][k])
          {
              for(int j=0;j<b.y;j++)
              {
                  c.bat[i][j]+=(a.bat[i][k]*b.bat[k][j]);
              }
          }
    return c;
}
juz quickf(juz a,int k)
{
    juz c=a;
    for(int i=0;i<a.x;i++)
      for(int j=0;j<a.x;j++)
          c.bat[i][j]=(i==j);
    while(k>=1)
    {
        if(k%2)
            c=mutp(c,a);
        k=k/2; a=mutp(a,a);
    }
    return c;
}
int main()
{
    int n,m,k;
    while(cin>>n>>m>>k&&(n||m||k))
    {
        juz a,b,c;
        a.x=1;a.y=n+1; b.x=n+1;b.y=n+1;
        for(int i=0;i<=n;i++)
        {
            a.bat[0][i]=0;
            b.bat[i][i]=1;
        }
        a.bat[0][0]=1;
        char tmp;
        int xx,yy;
        for(int i=0;i<k;i++)
        {
            cin>>tmp;
            if(tmp=='g')
            {
                cin>>xx;
                b.bat[0][xx]++;
            }
            else if(tmp=='e')
            {
                cin>>xx;
                for(int i=0;i<=n;i++)
                  b.bat[i][xx]=0;
            }
            else
            {
                cin>>xx>>yy;
                for(int i=0;i<=n;i++)
                {
                    int tx=b.bat[i][xx];
                    b.bat[i][xx]=b.bat[i][yy];
                    b.bat[i][yy]=tx;
                }
            }
        }
        c=quickf(b,m);
        c=mutp(a,c);
       for(int i=1;i<=n;i++)
         if(i!=n)cout<<c.bat[0][i]<<" ";
         else cout<<c.bat[0][i]<<endl;
    }
    return 0;
}
时间: 2024-08-01 18:47:24

poj 3735 大数量重复操作问题(矩阵快速幂)的相关文章

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

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 t

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/acS

POJ 3613 Cow Relays (floyd + 矩阵快速幂)

题目大意: 求刚好经过K条路的最短路 我们知道如果一个矩阵A[i][j] 表示表示 i-j 是否可达 那么 A*A=B  B[i][j]  就表示   i-j 刚好走过两条路的方法数 那么同理 我们把i-j 的路径长度存到A 中. 在A*A的过程中,不断取小的,那么最后得到的也就是i - j 走过两条路的最短路了. 当然也是利用到了floyd的思想. 然后要求出K次的最短路,那么就是矩阵快速幂的工作了. 注意要离散化.用map #include <cstdio> #include <io

POJ POJ 2778 DNA Sequence AC自动机 + 矩阵快速幂

首先建立Trie和失败指针,然后你会发现对于每个节点 i 匹配AGCT时只有以下几种情况: i 节点有关于当前字符的儿子节点 j 且安全,则i 到 j找到一条长度为 1的路. i 节点有关于当前字符的儿子节点 j 且 不安全,则i 到 j没有路. i 节点没有关于当前字符的儿子节点 但是能通过失败指针找到一个安全的节点j,那么 i 到 j 找到一条长度为1的路. 关于节点安全的定义: 当前节点不是末节点且当前节点由失败指针指回跟节点的路径上不存在不安全节点,那么这个节点就是安全节点. 然后问题就

poj 2778 DNA Sequence(AC自动机+矩阵快速幂)

题目链接:poj 2778 DNA Sequence 题目大意:给定一些含有疾病的DNA序列,现在给定DNA长度,问有多少种不同的DNA序列是健康的. 解题思路:对DNA片段建立AC自动机,因为最多10个串,每个串最长为10,所以最多可能有100个节点,在长度为n时 以每个节点终止的健康字符串个数形成一个状态集,通过AC自动机形成的边可以推导出n+1的状态集,走到单词节点是 非法的,所以同样的我们可以先走到单词节点,但是从单词节点不向后转移.这样可以构造一个矩阵,剩下的就是矩阵 快速幂.注意的一

POJ 3233 Matrix Power Series(矩阵快速幂)

Default Matrix Power Series Time Limit: 3000MS Memory Limit: 131072K Total Submissions: 15553 Accepted: 6658 Description Given a n × n matrix A and a positive integer k, find the sum S = A + A2 + A3 + - + Ak. Input The input contains exactly one test

POJ - 2778 ~ HDU - 2243 AC自动机+矩阵快速幂

这两题属于AC自动机的第二种套路通过矩阵快速幂求方案数. 题意:给m个病毒字符串,问长度为n的DNA片段有多少种没有包含病毒串的. 根据AC自动机的tire图,我们可以获得一个可达矩阵. 关于这题的tire图详解可以点击这里,往下面翻,这个博主的图对于tire图讲的非常详细. 知道了什么是tire图,理解了tire图后,后面的AC自动机的题目才能写. AC自动机的灵魂应该就是tire图 然后问题就变成了,得到了一个可达矩阵后,如何求方案数呢? 这个n = 2000000000 这咋办呢? 给定一

POJ 3744 Scout YYF I(矩阵快速幂 概率dp)

题目链接:http://poj.org/problem?id=3744 Description YYF is a couragous scout. Now he is on a dangerous mission which is to penetrate into the enemy's base. After overcoming a series difficulties, YYF is now at the start of enemy's famous "mine road"

POJ 3735 Training little cats 矩阵快速幂应用

点击打开链接 Training little cats Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 9807   Accepted: 2344 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