【矩阵快速幂】Recurrences UVA - 10870

Love The Way You Lie 2022-06-07 08:35 256阅读 0赞

Think:
1知识点:矩阵快速幂
2题意:这里写图片描述
现输入d, n, m求解f(n)
注:f(i) = f(i) mod m;
3题意思考:
(1):写出系数矩阵,矩阵快速幂求解
4反思:
(1):注意系数矩阵与初始序列的对应关系
(2):输入数据中每组测试数据换行相隔,而并不是要求在输出中每组测试数据以换行相隔,注意读题的严谨,注意细节

以下为Accepted代码

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <algorithm>
  4. using namespace std;
  5. typedef long long LL;
  6. LL mod;
  7. struct Matrix{
  8. LL v[24][24];
  9. };
  10. Matrix multiply(const Matrix &a, const Matrix &b, int Matrix_len);
  11. Matrix matrix_pow(Matrix x, LL k, int Matrix_len);
  12. LL rec[24];
  13. int main(){
  14. int d, i;
  15. LL n;
  16. while(~scanf("%d %lld %lld", &d, &n, &mod) && (d || n || mod)){
  17. Matrix x;
  18. memset(x.v, 0, sizeof(x.v));
  19. for(i = 1; i <= d; i++){
  20. scanf("%lld", &x.v[1][i]);
  21. x.v[1][i] %= mod;
  22. }
  23. for(i = 1;i < d; i++){
  24. x.v[i+1][i] = 1;
  25. }
  26. for(i = d; i >= 1; i--){
  27. /*初始序列:[f(d)...f(1)]*/
  28. scanf("%lld", &rec[i]);
  29. rec[i] %= mod;
  30. }
  31. if(n <= d) printf("%lld\n", rec[d-n+1]%mod);
  32. else {
  33. Matrix y = matrix_pow(x, n-d, d);
  34. LL ans = 0;
  35. for(i = 1; i <= d; i++){
  36. ans += y.v[1][i]*rec[i]%mod;
  37. ans %= mod;
  38. }
  39. printf("%lld\n", ans);
  40. }
  41. }
  42. return 0;
  43. }
  44. Matrix multiply(const Matrix &a, const Matrix &b, int Matrix_len){
  45. Matrix tmp;
  46. memset(tmp.v, 0, sizeof(tmp.v));
  47. for(int i = 1; i <= Matrix_len; i++){
  48. for(int j = 1; j <= Matrix_len; j++){
  49. for(int k = 1; k <= Matrix_len; k++){
  50. tmp.v[i][j] += (a.v[i][k]*b.v[k][j]);
  51. tmp.v[i][j] %= mod;
  52. }
  53. }
  54. }
  55. return tmp;
  56. }
  57. Matrix matrix_pow(Matrix x, LL k, int Matrix_len){
  58. Matrix tmp;
  59. memset(tmp.v, 0, sizeof(tmp.v));
  60. for(int i = 1; i <= Matrix_len; i++)
  61. tmp.v[i][i] = 1;
  62. while(k){
  63. if(k & 1)
  64. tmp = multiply(tmp, x, Matrix_len);
  65. x = multiply(x, x, Matrix_len);
  66. k >>= 1;
  67. }
  68. return tmp;
  69. }

发表评论

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

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

相关阅读

    相关 UVA 11551(矩阵快速)

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

    相关 快速矩阵快速

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