记录编号 321173 评测结果 AAAAAAAAAA
题目名称 [SYZOJ 218]小L的斐波那契数列游戏 最终得分 100
用户昵称 Gravatar‎MistyEye 是否通过 通过
代码语言 C++ 运行时间 0.464 s
提交时间 2016-10-13 15:51:00 内存使用 0.46 MiB
显示代码纯文本
  1. #include <cmath>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <iostream>
  5. using namespace std;
  6. const int maxn = 10005, mod = 998244353;
  7. int N, M, B;
  8. int b[maxn], c[maxn], d[maxn];
  9. int fib[maxn];
  10.  
  11. void Insert(int l, int r) {
  12. int bl = b[l], br = b[r];
  13. if (bl == br) {
  14. for (int i=l; i<=r; ++i)
  15. c[i] += fib[i-l+1], c[i] %= mod;
  16. return;
  17. }
  18. for (int i=l; b[i]==bl; ++i)
  19. c[i] += fib[i-l+1], c[i] %= mod;
  20. for (int i=r; b[i]==br; --i)
  21. c[i] += fib[i-l+1], c[i] %= mod;
  22. for (int i=bl+1; i<br; ++i) {
  23. int p = (i-1)*B+1;
  24. d[p] += fib[p-l+1], d[p] %= mod;
  25. ++p;
  26. d[p] += fib[p-l+1], d[p] %= mod;
  27. }
  28. }
  29. int Query(int p){
  30. int c1 = (b[p]-1)*B+1, c2 = c1+1;
  31. if(p==c1) return d[p]+c[p];
  32. while(c2!=p) {
  33. d[c2+1] = d[c1]+d[c2];
  34. d[c2+1] %= mod;
  35. ++c1, ++c2;
  36. }
  37. return d[p]+c[p];
  38. }
  39. int main(){
  40. freopen("chenyao_fib_game.in", "r", stdin);
  41. freopen("chenyao_fib_game.out", "w", stdout);
  42.  
  43. scanf("%d%d", &N, &M);
  44.  
  45. fib[1] = fib[2] = 1;
  46. for (int i=3; i<=N; ++i)
  47. fib[i] = fib[i-1]+fib[i-2], fib[i] %= mod;
  48.  
  49. B = (int)sqrt(N);
  50. for (int i=1; i<=N; ++i) b[i] = (i-1)/B+1;
  51.  
  52. for (int i=1,op,a,b; i<=M; ++i) {
  53. scanf("%d", &op);
  54. if (op==1) scanf("%d%d", &a, &b), Insert(a, b);
  55. else scanf("%d", &a), printf("%d\n", Query(a)%mod);
  56. }
  57.  
  58. return 0;
  59. }