UVA 11551(矩阵快速幂)

缺乏、安全感 2022-06-04 05:16 301阅读 0赞

题目来源:点击打开链接

题目题意:题目给我们n个数和r次操作。接在输入n行,表示每次将第i个数变成它后面几个位置的和。重复r次。

题目分析:我们按照题目的输入构造01矩阵,0表示不加上这个数,1表示加上。然后矩阵快速幂加速。

代码如下:

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cmath>
  4. #include<cstring>
  5. using namespace std;
  6. const int mod=1000;
  7. struct matrix
  8. {
  9. int f[55][55];
  10. matrix operator*(const struct matrix &a) const {
  11. matrix ans;
  12. for (int i=0;i<50;i++) {
  13. for (int j=0;j<50;j++) {
  14. ans.f[i][j]=0;
  15. for (int k=0;k<50;k++) {
  16. ans.f[i][j]=(ans.f[i][j]+f[i][k]*a.f[k][j])%mod;
  17. }
  18. }
  19. }
  20. return ans;
  21. }
  22. }a,b;
  23. matrix fast_pow(matrix base,int k)
  24. {
  25. matrix ans=base;
  26. while (k) {
  27. if (k&1)
  28. ans=ans*base;
  29. base=base*base;
  30. k>>=1;
  31. }
  32. return ans;
  33. }
  34. int main()
  35. {
  36. int t;
  37. scanf("%d",&t);
  38. while (t--) {
  39. int n,r;
  40. scanf("%d%d",&n,&r);
  41. memset (a.f,0,sizeof (a.f));
  42. memset (b.f,0,sizeof (b.f));
  43. for (int i=0;i<n;i++) {
  44. scanf("%d",&a.f[0][i]);
  45. }
  46. for (int i=0;i<n;i++) {
  47. int num;
  48. scanf("%d",&num);
  49. for (int j=0;j<num;j++) {
  50. int pos;
  51. scanf("%d",&pos);
  52. b.f[pos][i]=1;
  53. }
  54. }
  55. if (r==0) {
  56. for (int i=0;i<n;i++) {
  57. if (i==n-1) printf("%d\n",a.f[0][i]);
  58. else printf("%d ",a.f[0][i]);
  59. }
  60. }
  61. else {
  62. r--;
  63. matrix ans=fast_pow(b,r);
  64. ans=a*ans;
  65. for (int i=0;i<n;i++) {
  66. if (i==n-1) printf("%d\n",ans.f[0][i]);
  67. else printf("%d ",ans.f[0][i]);
  68. }
  69. }
  70. }
  71. return 0;
  72. }

发表评论

表情:
评论列表 (有 0 条评论,301人围观)

还没有评论,来说两句吧...

相关阅读

    相关 UVA 11551(矩阵快速)

    题目来源:[点击打开链接][Link 1] 题目题意:题目给我们n个数和r次操作。接在输入n行,表示每次将第i个数变成它后面几个位置的和。重复r次。 题目分析:我们按照题目

    相关 快速矩阵快速

    前言 新年第一篇技术类的文章,应该算是算法方面的文章的。看标题:快速幂和矩阵快速幂,好像挺高大上。其实并不是很难,快速幂就是快速求一个数的幂(一个数的 n 次方)。