hdu1757 构造矩阵

Lele now is thinking about a simple function f(x).

If x < 10 f(x) = x.
If x >= 10 f(x) = a0 * f(x-1) + a1 * f(x-2) + a2 * f(x-3) + …… + a9 * f(x-10);
And ai(0<=i<=9) can only be 0 or 1 .

Now, I will give a0 ~ a9 and two positive integers k and m ,and could you help Lele to caculate f(k)%m.

构造一个矩阵

{

a0 a1 a2 a3 a4 a5 a6 a7 a8 a9

1  0   0   0   0  0   0  0   0   0

0  1   0   0   0  0   0  0   0   0

0  0   1   0   0  0   0  0   0   0

0  0   0   1   0  0   0  0   0   0

0  0   0   0   1  0   0  0   0   0

0  0   0   0   0  1   0  0   0   0

0  0   0   0   0  0   1  0   0   0

0  0   0   0   0  0   0  1   0   0

0  0   0   0   0  0   0  0   1   0

}得解

#include <iostream>
#include <algorithm>
#include <string.h>
#include <cstdio>
#include <math.h>
using namespace std;
typedef long long LL;
const int maxn=15;
int MOD;
struct Matrix
{
    LL m[maxn][maxn];
    Matrix mult(Matrix &rhs)
    {
        Matrix ans;
        for(int i=0; i<10; i++)
            for(int j=0; j<10; j++)
             {
                ans.m[i][j]=0;
                for(int k=0; k<10; k++)
                ans.m[i][j]=(ans.m[i][j]+(m[i][k]*rhs.m[k][j])%MOD )%MOD;

             }
       return ans;
    }
};
int a[10];
void powk(int n)
{
    Matrix A,ans;
    memset(ans.m,0,sizeof(ans.m));
    memset(A.m,0,sizeof(A.m));
    for(int i=0; i<10; i++){
        ans.m[i][i]=1;
        A.m[0][i]=a[i];
        A.m[i+1][i]=1;
    }
    while(n)
        {
             if(n&1)ans=ans.mult(A);
              n>>=1;
              A=A.mult(A);
        }
     LL AS=0;
     for(LL i=0; i<10; i++){
         AS=(AS+(ans.m[0][i]*(-i+9))%MOD )%MOD;
     }
     printf("%I64d\n",AS);
}
int main()
{
    int k;
    while(scanf("%d%d",&k,&MOD)==2)
    {
          for(int i=0; i<10; i++)scanf("%d",&a[i]);
          if(k<10){
            printf("%d\n",k%MOD); continue;
          }
          powk(k-9);
    }
    return 0;
}

时间: 2024-08-04 11:54:40

hdu1757 构造矩阵的相关文章

hdu 5015 233 Matrix(构造矩阵)

http://acm.hdu.edu.cn/showproblem.php?pid=5015 因为是个二维的递推式,当时没有想到可以这样构造矩阵.从列上看,当前这一列都是由前一列递推得到.根据这一点来构造矩阵.令b[i]代表第i列,是一个(n+2)*1的矩阵,即b[1] = [1,233......],之所以在加了两行,是要从前一个矩阵b[i-1]得到b[i]中的第二个数2333...,再构造一个转换矩阵a,它是一个(n+2)*(n+2)的矩阵,那么a^(m-1) * b就是第m列. /* a矩

hdu 1757 A Simple Math Problem 构造矩阵

题意:函数f(x), 若 x < 10 f(x) = x. 若 x >= 10 f(x) = a0 * f(x-1) + a1 * f(x-2) + a2 * f(x-3) + …… + a9 * f(x-10); 且 ai(0<=i<=9) 仅为 0 或 1 . 给定k,m,求f(k)%m; 思路:求一个递推函数的函数值,显然是矩阵快速幂,矩阵构造方法如下: #include<cstdio> #include<cstring> #include<al

构造矩阵解决问题 【nyoj299 Matrix Power Series】

矩阵的又一个新用法,构造矩阵进行快速幂. 比如拿 nyoj299 Matrix Power Series 来说 给出这样一个递推式: S = A + A2 + A3 + - + Ak. 让你求s,A是一个矩阵,而k非常大.怎么办呢? 推理发现:Fn = A + A*F(n-1) 然后我们可以构造矩阵: (Fn ,1 ) =  (Fn-1 ,1) * (A,0.A,1) = (F1 , 1) * (A,0.A,1)^K-1 那么我们就可以用一个矩阵快速幂了. 下面是模板题目的代码: #includ

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次后,问每只猫有多少颗花生? 再一次感受到了矩阵的强大...循环m次,且m这么大,很容易想到构造转换矩阵,但如何构造是个问题.尤其是第一种操作,第i只猫增加一个花生.具体构造方法是把矩阵扩大为(

HDU 1575 &amp;&amp; 1757 矩阵快速幂&amp;&amp;构造矩阵入门

HDU 1575 Tr A Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 2912    Accepted Submission(s): 2167 Problem Description A为一个方阵,则Tr A表示A的迹(就是主对角线上各项的和),现要求Tr(A^k)%9973. Input 数据的第一行是一个T,表示有T组数据.每组

hdu 5015 233 Matrix(西安网络赛1009)【构造矩阵】

说起这题简直醉了..当时愣是没想到该怎么做,搞了好久,虽然有想过构造矩阵,但是没仔细想下去. 此题构造两个矩阵,假设a[]数组为题目给出的数据,最多有10个元素,我们可以构造一个矩阵A: a={a[1],a[2],a[3],...a[n],23,3}  大小为1*(n+2) 要得到题目需要的计算结果,那么在构造一个矩阵B,大小为(n+2)*(n+2):(假设n=3) b=   1    1    1    0    0 0    1    1    0    0 0    0    1    0

[数学-构造矩阵]NEFU 1113

依据题意.我已经推导出tn的公式.ti=ti.a+ti.b,ti.a=5*t(i-1).a+4*t(i-1).b,ti.b=t(i-1).a+t(i-1).b 然而以下居然不能继续推到sn的公式!!! ! 这道题考察的就是求随意数列的前n项和,在sn的递推公式不太明显的时候.用矩阵解决. 设矩阵A=.矩阵F0= " /> 那么设矩阵S=(A+A2+A3-. + An)*F0 终于答案就是矩阵S内两个元素之和. 那么怎么求A+A2+A3-. + An ? 能够继续构造例如以下的分块矩阵,当中

构造矩阵解决这个问题 【nyoj299 Matrix Power Series】

矩阵的又一个新使用方法,构造矩阵进行高速幂. 比方拿 nyoj299 Matrix Power Series 来说 给出这样一个递推式: S = A + A2 + A3 + - + Ak. 让你求s.A是一个矩阵,而k很大. 怎么办呢? 推理发现:Fn = A + A*F(n-1) 然后我们能够构造矩阵: (Fn .1 ) =  (Fn-1 ,1) * (A.0. A,1) = (F1 , 1) * (A,0. A,1)^K-1 那么我们就能够用一个矩阵高速幂了. 以下是模板题目的代码: #in

UVa 11149 Power of Matrix (矩阵快速幂,倍增法或构造矩阵)

题意:求A + A^2 + A^3 + ... + A^m. 析:主要是两种方式,第一种是倍增法,把A + A^2 + A^3 + ... + A^m,拆成两部分,一部分是(E + A^(m/2))(A + A^2 + A^3 + ... + A^(m/2)),然后依次计算下去,就可以分解,logn的复杂度分解,注意要分奇偶. 另一种是直接构造矩阵,,然后就可以用辞阵快速幂计算了,注意要用分块矩阵的乘法. 代码如下: 倍增法: #pragma comment(linker, "/STACK:10