记录编号 435212 评测结果 AAAAAAAAAA
题目名称 [HZOI 2016]简单的AVL树 最终得分 100
用户昵称 GravatarHeHe 是否通过 通过
代码语言 C++ 运行时间 0.002 s
提交时间 2017-08-09 10:58:44 内存使用 0.31 MiB
显示代码纯文本
  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstring>
  4. using namespace std;
  5.  
  6. typedef unsigned long long LL;
  7.  
  8. inline void Pow(LL x);
  9.  
  10. LL N, p;
  11. LL res[3][3] = {{1, 0, 0},
  12. {0, 1, 0},
  13. {0, 0, 1}};
  14. LL P[3][3] = {{0, 1, 0},
  15. {1, 1, 0},
  16. {0, 1, 1}};
  17. LL ans[1][3] = {0, 1, 1};
  18. LL temp[3][3];
  19.  
  20. int main() {
  21. #ifndef LOCAL
  22. freopen("AVL.in", "r", stdin);
  23. freopen("AVL.out", "w", stdout);
  24. #endif
  25. scanf("%lld%lld", &N, &p);
  26. //for(LL i = 2; i <= N; ++i) {
  27. // tmp = pre;
  28. // pre = now;
  29. // now = now % p + tmp % p + 1;
  30. //}
  31. Pow(N);
  32. memset(temp, 0x00, sizeof(temp));
  33. for(char i = 0; i < 1; ++i)
  34. for(char j = 0; j < 3; ++j)
  35. for(char k = 0; k < 3; ++k)
  36. (temp[i][j] += ans[i][k] * res[k][j]) %= p;
  37. printf("%lld", temp[0][0]);
  38. return 0;
  39. }
  40.  
  41. inline void Pow(LL x) {
  42. while(x) {
  43. if(x & 1) {
  44. memset(temp, 0x00, sizeof(temp));
  45. for(char i = 0; i < 3; ++i)
  46. for(char j = 0; j < 3; ++j)
  47. for(char k = 0; k < 3; ++k)
  48. (temp[i][j] += res[i][k] * P[k][j]) %= p;
  49. for(char i = 0; i < 3; ++i)
  50. for(char j = 0; j < 3; ++j)
  51. res[i][j] = temp[i][j];
  52. }
  53. memset(temp, 0x00, sizeof(temp));
  54. for(char i = 0; i < 3; ++i)
  55. for(char j = 0; j < 3; ++j)
  56. for(char k = 0; k < 3; ++k)
  57. (temp[i][j] += P[i][k] * P[k][j]) %= p;
  58. for(char i = 0; i < 3; ++i)
  59. for(char j = 0; j < 3; ++j)
  60. P[i][j] = temp[i][j];
  61. x >>= 1;
  62. }
  63. return ;
  64. }