hdu 5015 大数量反复类似操作问题/ 矩阵高速幂

题意: 给一个矩阵a,第一行是 0。 233,2333,23333.....第一列读入。列数<10^9.行数<=10.

先转化操作: m是大数量。必定每次向前推一列。就是每次乘一个矩阵T。就推一列,画画草稿自热而然就想到了。

转化阵T(n+2*n+2)和初始矩阵A(n+2*1 ):

T={ 1,0,0,0,0,0,0,0,0,0...10,1
    1 1 0 0 0 0 0 0 0 0   10 1
    1 1 1 0 0 0 0 0 0 0   10 1
    1 1 1 1 0 0 0 0 0 0   10 1
    ...
    1 1 1 1 1 1 1 1 1 1   10 1
    0 0 0 0 0 0 0 0 0 0   10 1
    0 0 0 0 0 0 0 0 0 0    0 1
}
A={ a1
    a2
    .
    .
    .
    23
    3
}
#include<iostream>
#include<cstring>
using namespace std;
struct juz
{
    long long  bat[15][15];
    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]=(c.bat[i][j]+(a.bat[i][k]*b.bat[k][j])%10000007)%10000007;
              }
          }
    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)
    {
        juz a,b,c;
        a.x=n+2;a.y=1; b.x=n+2;b.y=n+2;
        for(int i=0;i<n;i++)
        {
            cin>>a.bat[i][0];
        }
        a.bat[n][0]=23; a.bat[n+1][0]=3;
        for(int i=0;i<n+2;i++)
            for(int j=0;j<n+2;j++)
            {
                if(i>=j&&i<n)
                    b.bat[i][j]=1;
                else
                   b.bat[i][j]=0;
                if(j==n&&i!=n+1)
                   b.bat[i][j]=10;
                if(j==n&&i==n+1)
                   b.bat[i][j]=0;
                if(j==n+1)
                   b.bat[i][j]=1;
            }
        c=quickf(b,m);
        c=mutp(c,a);
       cout<<c.bat[n-1][0]<<endl;
    }
    return 0;
}
时间: 2024-10-21 13:34:39

hdu 5015 大数量反复类似操作问题/ 矩阵高速幂的相关文章

hdu 5015 大数量重复相似操作问题/ 矩阵快速幂

题意: 给一个矩阵a,第一行是 0, 233,2333,23333.....第一列读入,列数<10^9.行数<=10. 先转化操作: m是大数量,必然每次向前推一列,就是每次乘一个矩阵T,就推一列,画画草稿自热而然就想到了. 转化阵T(n+2*n+2)和初始矩阵A(n+2*1 ): T={ 1,0,0,0,0,0,0,0,0,0...10,1 1 1 0 0 0 0 0 0 0 0 10 1 1 1 1 0 0 0 0 0 0 0 10 1 1 1 1 1 0 0 0 0 0 0 10 1 .

hdu 4878 ZCC loves words(AC自动机+dp+矩阵快速幂+中国剩余定理)

hdu 4878 ZCC loves words(AC自动机+dp+矩阵快速幂+中国剩余定理) 题意:给出若干个模式串,总长度不超过40,对于某一个字符串,它有一个价值,对于这个价值的计算方法是这样的,设初始价值为V=1,假如这个串能匹配第k个模式串,则V=V*prime[k]*(i+len[k]),其中prime[k]表示第k个素数,i表示匹配的结束位置,len[k]表示第k个模式串的长度(注意,一个字符串可以多次匹配同意个模式串).问字符集为'A'-'Z'的字符,组成的所有的长为L的字符串,

hdu 4549 M斐波那契数列(矩阵高速幂,高速幂降幂)

http://acm.hdu.edu.cn/showproblem.php?pid=4549 f[0] = a^1*b^0%p,f[1] = a^0*b^1%p,f[2] = a^1*b^1%p.....f[n] = a^fib[n-1] * b^fib[n-2]%p. 这里p是质数,且a,p互素,那么我们求a^b%p,当b非常大时要对b降幂. 由于a,p互素,那么由费马小定理知a^(p-1)%p = 1.令b = k*(p-1) + b'.a^b%p = a^(k*(p-1)+b')%p =

HDU - 2294 Pendant (DP滚动数组降维+矩阵快速幂)

Description On Saint Valentine's Day, Alex imagined to present a special pendant to his girl friend made by K kind of pearls. The pendant is actually a string of pearls, and its length is defined as the number of pearls in it. As is known to all, Ale

HDU 1588 Gauss Fibonacci(矩阵高速幂+二分等比序列求和)

HDU 1588 Gauss Fibonacci(矩阵高速幂+二分等比序列求和) ACM 题目地址:HDU 1588 Gauss Fibonacci 题意: g(i)=k*i+b;i为变量. 给出k,b,n,M,问( f(g(0)) + f(g(1)) + ... + f(g(n)) ) % M的值. 分析: 把斐波那契的矩阵带进去,会发现这个是个等比序列. 推倒: S(g(i)) = F(b) + F(b+k) + F(b+2k) + .... + F(b+nk) // 设 A = {1,1,

HDU 4965 Fast Matrix Calculation(矩阵高速幂)

HDU 4965 Fast Matrix Calculation 题目链接 矩阵相乘为AxBxAxB...乘nn次.能够变成Ax(BxAxBxA...)xB,中间乘n n - 1次,这样中间的矩阵一个仅仅有6x6.就能够用矩阵高速幂搞了 代码: #include <cstdio> #include <cstring> const int N = 1005; const int M = 10; int n, m; int A[N][M], B[M][N], C[M][M], CC[N

hdu 5318 The Goddess Of The Moon 矩阵高速幂

链接:http://acm.hdu.edu.cn/showproblem.php?pid=5318 The Goddess Of The Moon Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 438    Accepted Submission(s): 150 Problem Description Chang'e (嫦娥) is

hdu 5411 CRB and Puzzle 矩阵高速幂

链接 题解链接:http://www.cygmasot.com/index.php/2015/08/20/hdu_5411/ 给定n个点 常数m 以下n行第i行第一个数字表示i点的出边数.后面给出这些出边. 问:图里存在多少条路径使得路径长度<=m.路径上的点能够反复. 思路: 首先能得到一个m*n*n的dp.dp[i][j]表示路径长度为i 路径的结尾为j的路径个数 . 答案就是sigma(dp[i][j]) for every i from 1 to m, j from 1 to n; 我们

HDU 2604 Queuing 矩阵高速幂

QueuingTime Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 2483    Accepted Submission(s): 1169 Problem Description Queues and Priority Queues are data structures which are known to most computer s