题解

感觉智商为0啊QAQ

显然对于一个长度为\(len\)的border,每个点同余\(n - len\)的部分必然相等

那么我们求一个\(f[a]\)数组,如果存在\(s[x] = 0\)且\(s[y] = 1\)且\(|x - y| = a\)

这个很好求,只要把0和1分别挑出来,NTT卷一下就好了

一个\(len\)合法,即它的\(n - len\)的倍数\(k\),\(f[k]\)都等于0

代码

  1. #include <bits/stdc++.h>
  2. #define fi first
  3. #define se second
  4. #define pii pair<int,int>
  5. #define pdi pair<db,int>
  6. #define mp make_pair
  7. #define pb push_back
  8. #define enter putchar('\n')
  9. #define space putchar(' ')
  10. #define eps 1e-8
  11. #define mo 974711
  12. #define MAXN 500005
  13. //#define ivorysi
  14. using namespace std;
  15. typedef long long int64;
  16. typedef double db;
  17. template<class T>
  18. void read(T &res) {
  19. res = 0;char c = getchar();T f = 1;
  20. while(c < '0' || c > '9') {
  21. if(c == '-') f = -1;
  22. c = getchar();
  23. }
  24. while(c >= '0' && c <= '9') {
  25. res = res * 10 + c - '0';
  26. c = getchar();
  27. }
  28. res *= f;
  29. }
  30. template<class T>
  31. void out(T x) {
  32. if(x < 0) {x = -x;putchar('-');}
  33. if(x >= 10) {
  34. out(x / 10);
  35. }
  36. putchar('0' + x % 10);
  37. }
  38. const int MOD = 998244353,MAXL = (1 << 20);
  39. int W[MAXL + 5],f[MAXL + 5],g[MAXL + 5],N;
  40. char s[MAXN];
  41. int inc(int a,int b) {
  42. return a + b >= MOD ? a + b - MOD : a + b;
  43. }
  44. int mul(int a,int b) {
  45. return 1LL * a * b % MOD;
  46. }
  47. int fpow(int x,int c) {
  48. int res = 1,t = x;
  49. while(c) {
  50. if(c & 1) res = mul(res,t);
  51. t = mul(t,t);
  52. c >>= 1;
  53. }
  54. return res;
  55. }
  56. void NTT(int *p,int len,int on) {
  57. for(int i = 1 , j = len >> 1 ; i < len - 1 ; ++i) {
  58. if(i < j) swap(p[i],p[j]);
  59. int k = (len >> 1);
  60. while(j >= k) {
  61. j -= k;
  62. k >>= 1;
  63. }
  64. j += k;
  65. }
  66. for(int h = 2 ; h <= len ; h <<= 1) {
  67. int wn = W[(MAXL + MAXL / h * on) % MAXL];
  68. for(int k = 0 ; k < len ; k += h) {
  69. int w = 1;
  70. for(int j = k ; j < k + h / 2 ; ++j) {
  71. int u = p[j],t = mul(p[j + h / 2],w);
  72. p[j] = inc(u,t);
  73. p[j + h / 2] = inc(u,MOD - t);
  74. w = mul(w,wn);
  75. }
  76. }
  77. }
  78. if(on == -1) {
  79. int InvL = fpow(len,MOD - 2);
  80. for(int i = 0 ; i < len ; ++i) p[i] = mul(p[i],InvL);
  81. }
  82. }
  83. void Init() {
  84. W[0] = 1;W[1] = fpow(3,(MOD - 1) / MAXL);
  85. for(int i = 2 ; i < MAXL ; ++i) {
  86. W[i] = mul(W[i - 1],W[1]);
  87. }
  88. scanf("%s",s + 1);
  89. }
  90. void Solve() {
  91. int t = 1;
  92. N = strlen(s + 1);
  93. while(t <= 2 * N) t <<= 1;
  94. for(int i = 1 ; i <= N ; ++i) {
  95. f[i] = (s[i] == '1');
  96. g[i] = (s[N - i + 1] == '0');
  97. }
  98. NTT(f,t,1);NTT(g,t,1);
  99. for(int i = 0 ; i < t; ++i) f[i] = mul(f[i],g[i]);
  100. NTT(f,t,-1);
  101. int64 ans = 1LL * N * N;
  102. for(int i = 1 ; i < N ; ++i) {
  103. int t = i;
  104. bool flag = 0;
  105. while(t < N) {
  106. if(f[N - t + 1] || f[N + t + 1]) {flag = 1;break;}
  107. t += i;
  108. }
  109. if(!flag) ans ^= 1LL * (N - i) * (N - i);
  110. }
  111. out(ans);enter;
  112. }
  113. int main() {
  114. #ifdef ivorysi
  115. freopen("f1.in","r",stdin);
  116. #endif
  117. Init();
  118. Solve();
  119. }

【LOJ】#6436. 「PKUSC2018」神仙的游戏的更多相关文章

  1. LOJ #6436. 「PKUSC2018」神仙的游戏(字符串+NTT)

    题面 LOJ #6436. 「PKUSC2018」神仙的游戏 题解 参考 yyb 的口中的长郡最强选手 租酥雨大佬的博客 ... 一开始以为 通配符匹配 就是类似于 BZOJ 4259: 残缺的字符串 ...

  2. LOJ 6436 「PKUSC2018」神仙的游戏——思路+卷积

    题目:https://loj.ac/problem/6436 看题解才会. 有长为 i 的 border ,就是有长为 n-i 的循环节. 考虑如果 x 位置上是 0 . y 位置上是 1 ,那么长度 ...

  3. loj#6436. 「PKUSC2018」神仙的游戏(生成函数)

    题意 链接 Sol 生成函数题都好神仙啊qwq 我们考虑枚举一个长度\(len\).有一个结论是如果我们按\(N - len\)的余数分类,若同一组内的全为\(0\)或全为\(1\)(?不算),那么存 ...

  4. LOJ #6436. 「PKUSC2018」神仙的游戏

    题目分析 通过画图分析,如果存在border长度为len,则原串一定是长度为n-len的循环串. 考虑什么时候无法形成长度为len的循环串. 显然是两个不同的字符的距离为len的整数倍时,不存在这样的 ...

  5. loj#6436. 「PKUSC2018」神仙的游戏(NTT)

    题面 传送门 题解 一旦字符串踏上了通配符的不归路,它就永远脱离了温暖的字符串大家庭的怀抱 用人话说就是和通配符扯上关系的字符串就不是个正常的字符串了比如说这个 让我们仔细想想,如果一个长度为\(le ...

  6. 「PKUSC2018」神仙的游戏

    题目链接 比如说上面\(|S|\)为12的字符串,我们欲求出\(f(9)\)的值,那么上面相同颜色的字符必须两两能够匹配.也就是说,同种颜色的字符集里不能同时出现0和1.如果只考虑同种颜色集里相邻的两 ...

  7. LOJ6436. 「PKUSC2018」神仙的游戏 [NTT]

    传送门 思路 首先通过各种手玩/找规律/严谨证明,发现当\(n-i\)为border当且仅当对于任意\(k\in[0,i)\),模\(i\)余\(k\)的位置没有同时出现0和1. 换句话说,拿出任意一 ...

  8. LOJ #6435. 「PKUSC2018」星际穿越(倍增)

    题面 LOJ#6435. 「PKUSC2018」星际穿越 题解 参考了 这位大佬的博客 这道题好恶心啊qwq~~ 首先一定要认真阅读题目 !! 注意 \(l_i<r_i<x_i\) 这个条 ...

  9. LOJ #6432. 「PKUSC2018」真实排名(组合数)

    题面 LOJ #6432. 「PKUSC2018」真实排名 注意排名的定义 , 分数不小于他的选手数量 !!! 题解 有点坑的细节题 ... 思路很简单 , 把每个数分两种情况讨论一下了 . 假设它为 ...

随机推荐

  1. 【刷题】BZOJ 3033 太鼓达人

    Description 七夕祭上,Vani牵着cl的手,在明亮的灯光和欢乐的气氛中愉快地穿行.这时,在前面忽然出现了一台太鼓达人机台,而在机台前坐着的是刚刚被精英队伍成员XLk.Poet_shy和ly ...

  2. NOI.AC 20181103 题解

    CF 1037B  Reach Median 班上 n个同学(n 是奇数)排成一排站队,为了美观,需要大家高度的中位数是 x. 你可以让同学们在脚下垫木板或者稍微蹲一点来达成这个目标.对任意一位同学的 ...

  3. C++代理模式

    主要根据代理模式整理,感谢作者分享! [DP]上的定义:为其他对象提供一种代理以控制对这个对象的访问.有四种常用的情况:(1)远程代理,(2)虚代理,(3)保护代理,(4)智能引用.本文主要介绍虚代理 ...

  4. 形参与实参的区别---java基础

    1.形参变量只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配的内存单元.因此,形参只在函数内部有效.函数调用结束返回主调用函数后则不能再使用该形参变量.2.实参可以是常量.变量.表达式.函数 ...

  5. Java 调用 groovy 脚本文件,groovy 访问 MongoDB

    groovy 访问 MongoDB 示例: shell.groovy package db import com.gmongo.GMongoClient import com.mongodb.Basi ...

  6. Linux文本处理工具——Sed

    sed:数据流编辑器: awk:报告文本的生成器 sed 基本用法:(Stream EDitor) Stream 流 EDitor 编辑器 行编辑器 全屏编辑器:vi/vimsed:内存空间(模式空间 ...

  7. Codeforces Round #481 (Div. 3) G. Petya's Exams

    http://codeforces.com/contest/978/problem/G 感冒是真的受不了...敲代码都没力气... 题目大意: 期末复习周,一共持续n天,有m场考试 每场考试有如下信息 ...

  8. Splay模板讲解及一些题目

    普通平衡树模板以及文艺平衡树模板链接. 简介 平衡二叉树(Balanced Binary Tree)具有以下性质:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二 ...

  9. UI渲染回顾简单笔记

    UI渲染的简单过程: CPU,GPU,显示器协同工作,CPU 中计算显示内容,比如视图的创建.布局计算.图片解码.文本绘制等,然后将计算结果提交给GPU,由 GPU 进行变换.合成.渲染.随后 GPU ...

  10. [USACO08DEC]Trick or Treat on the Farm 记忆化搜索

    这一题非常水,因为每个点的下一个目的地是唯一的,可以考虑对每一个还为访问过的点dfs直接找出所有的环,同时更新每一个点能去的点的数量(即答案). 我们dfs时找到环上已经遍历过的一个点,用当前的dfn ...