zoukankan      html  css  js  c++  java
  • 矩阵够造+二分幂——hdu1588

    构造矩阵,题比较水不解释了
    View Code
    #include<stdio.h>
    #include
    <string.h>

    int mod;//矩阵中间数求模
    int n;
    int a[19];

    struct data
    {
    int map[11][11];
    };

    data matrix(data a,data b)
    //矩阵乘法
    {
    int i,j,k;
    data re;
    for(i=0;i<n;i++)
    {
    for(j=0;j<n;j++)
    {
    int all=0;
    for(k=0;k<n;k++)
    {
    all
    +=(a.map[i][k]*b.map[k][j])%mod;
    all
    %=mod;
    }
    re.map[i][j]
    =all%mod;
    }
    }
    return re;
    }

    data matrixT(data f,
    int p)//二分求矩阵
    {
    int i,j;
    data all;
    for(i=0;i<n;i++){//初始化一个单位矩阵
    for(j=0;j<n;j++){
    all.map[i][j]
    =0;
    if(i==j)all.map[i][j]=1;
    }
    }

    while(p>0)//二分求矩阵
    {
    if(p&1==1)
    {all
    =matrix(all,f);}

    f
    =matrix(f,f);
    p
    >>=1;
    }
    return all;
    }

    int main()
    {
    int p;
    n
    =10;
    while(scanf("%d%d",&p,&mod)!=EOF)
    {
    p
    =p-9;
    int i,j;
    data f;
    for(i=0;i<n;i++)
    {
    scanf(
    "%d",&a[i]);
    }
    for(i=0;i<n-1;i++)
    {
    for(j=0;j<n;j++)
    {
    f.map[i][j]
    =0;
    if(i+1==j)
    f.map[i][j]
    =1;
    }
    }
    for(j=0;j<n;j++)
    f.map[
    9][j]=a[n-j-1];
    data end
    =matrixT(f,p);

    int all=0;
    for(j=0;j<n;j++)
    {
    all
    +=end.map[9][j]*j%mod;
    }
    printf(
    "%d\n",all%mod);
    }
    return0;
    }

      

  • 相关阅读:
    HDU 4472 Count DP题
    HDU 1878 欧拉回路 图论
    CSUST 1503 ZZ买衣服
    HDU 2085 核反应堆
    HDU 1029 Ignatius and the Princess IV
    UVa 11462 Age Sort
    UVa 11384
    UVa 11210
    LA 3401
    解决学一会儿累了的问题
  • 原文地址:https://www.cnblogs.com/huhuuu/p/2116580.html
Copyright © 2011-2022 走看看