LightOJ-1132-矩阵快速幂,math

来源:互联网 发布:获取json对象的key 编辑:程序博客网 时间:2024/06/01 07:16

题目大意:给定n,k;求(1K + 2K + 3K + ... + NK) % 232

题目解析:由[i^0,i^1,i^2,-----i^k]推出[(i+1)^0-----(i+1)^k],要用组合数公式,所以构造矩阵就是组合数了,还要开个空间保存前面的sum即可;

AC代码:

#include<iostream>  #include<cstdio>  #include<algorithm>  #include<cstring>  #include<string>  #define ll unsigned int #define LL long longusing namespace std;  int mod; int size; struct mat  {      ll a[55][55];      mat()      {          memset(a,0,sizeof(a));      }     };  mat multi(mat m1,mat m2)  {        int i,j,k;      mat ans=mat();         for(i=1;i<=size;i++)            for(j=1;j<=size;j++)                if(m1.a[i][j])                   for(k=1;k<=size;k++)                        ans.a[i][k]=(ans.a[i][k]+m1.a[i][j]*m2.a[j][k]);       return ans;    }    mat fun(mat m,LL n)  {      mat ans=mat();      int i;      for(i=1;i<=size;i++)ans.a[i][i]=1;      while(n)      {          if(n&1)ans=multi(m,ans);          m=multi(m,m);          n>>=1;      }      return ans;  }    int main()  {      int cas,c,i,a,b,cc,k,j; LL n;     scanf("%d",&cas);      for(cc=1;cc<=cas;cc++)      {          scanf("%lld%d",&n,&k);         size=k+2;        mat chu=mat(),gouzao=mat();          for(i=1;i<=k+1;i++)chu.a[1][i]=1;        printf("Case %d: ",cc);         for(j=1;j<=k+1;j++)       {    for(i=1;i<=j;i++){if(i==1||i==j)gouzao.a[i][j]=1;else {gouzao.a[i][j]=gouzao.a[i-1][j-1]+gouzao.a[i][j-1];}}       }    gouzao.a[k+1][k+2]=1;    gouzao.a[k+2][k+2]=1;        printf("%u\n",multi(chu,fun(gouzao,n)).a[1][k+2]);       }       return 0;  }  



0 0
原创粉丝点击