• A Simple Math Problem(HDU 1757 构造矩阵)



    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 .

    Sample Input
    10 9999
    1 1 1 1 1 1 1 1 1 1
    20 500
    1 0 1 0 1 0 1 0 1 0
     
    Sample Output
    45
    104

     1 #include <iostream>
     2 #include <cstring>
     3 #include <cstdio>
     4 #include <algorithm>
     5 using namespace std;
     6 int k,n;
     7 struct Matrix
     8 {
     9     int mat[10][10];
    10 }p;
    11 int aa[10];
    12 Matrix mul(Matrix a,Matrix b)
    13 {
    14     Matrix c;
    15     for(int i=0;i<10;i++)
    16     {
    17         for(int j=0;j<10;j++)
    18         {
    19             c.mat[i][j]=0;
    20             for(int k=0;k<10;k++)
    21                 c.mat[i][j]=(c.mat[i][j]+a.mat[i][k]*b.mat[k][j])%n;
    22         }
    23     }
    24     return c;
    25 }
    26 Matrix mod_pow(Matrix x,int n)
    27 {
    28     Matrix res;
    29     memset(res.mat,0,sizeof(res.mat));
    30     for(int i=0;i<10;i++)
    31         res.mat[i][i]=1;
    32     while(n)
    33     {
    34         if(n&1)
    35             res=mul(res,x);
    36         x=mul(x,x);
    37         n>>=1;
    38     }
    39     return res;
    40 }
    41 int main()
    42 {
    43     freopen("in.txt","r",stdin);
    44     while(scanf("%d%d",&k,&n)!=EOF)
    45     {
    46         if(k<10)
    47         {
    48             printf("%d
    ",k);
    49             continue;
    50         }
    51         memset(p.mat,0,sizeof(p.mat));
    52         for(int i=0;i<10;i++)
    53             cin>>p.mat[0][i];
    54         for(int i=1;i<10;i++)
    55             p.mat[i][i-1]=1;
    56         Matrix ans= mod_pow(p,k-9);
    57         /*for(int i=0;i<10;i++)
    58         {
    59             for(int j=0;j<10;j++)
    60                 cout<<ans.mat[i][j]<<" ";
    61             cout<<endl;
    62         }*/
    63         int sum=0;
    64         for(int i=0;i<10;i++)
    65             sum+=ans.mat[0][i]*(9-i);
    66         printf("%d
    ",sum%n);
    67     }
    68 }
  • 相关阅读:
    No.2 对象与内存控制(内存分配)
    No.1 数组与内存控制
    Json解析 在VS中
    MVC 搜索防止点击其他按钮
    执行多个lanmada表达式查询
    删除重复数据
    分页
    DataSet与二进制文件和XML文件
    关于时间的转换
    转换人民币大小金额
  • 原文地址:https://www.cnblogs.com/a1225234/p/5465098.html
Copyright © 2020-2023  润新知