题目传送门

  传送门I

  传送门II

  传送门III

题目大意

  给定将$\left \{ 0, 1, \dots, m - 1\right \}$分成了不相交的两个非空集合$A$和$B$,给定$A$,问存在多少个整数$x$满足$0\leqslant x < m$且对于任意$a\in A, b \in B$满足$a + b\not \equiv x \pmod{m}$

  容易发现满足后一个条件的充分必要条件是对于任意$a \in A$,存在$a' \in A$使得$a + a' \equiv x \pmod{m}$。

  如果$a \leqslant x$,则易证$a' \leqslant x$。

  同样,如果$a > x$,则易证$a' > x$。

  所以这个数$x$将序列分成两部分,每一部分首尾配对后,每一对的和都等于$x$。

  那么怎么判断呢?我们发现$a + d = c + b$等价于$a - b = c - d$。

  所以我们只用差分一下判断是否是回文,再判断首尾的和是否等于$x$就行了。

Code

 /**
* Codeforces
* Problem#1045B
* Accepted
* Time: 77ms
* Memory: 7300k
*/
#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <vector>
using namespace std;
typedef bool boolean; #define ull unsigned long long const int N = 2e5 + ;
const ull base = 1e9 + ; int n, M;
int ar[N];
int cr[N];
ull ph[N], sh[N], pb[N]; int add(int a, int b) {
return ((a += b) >= M) ? (a - M) : (a);
} inline void init() {
scanf("%d%d", &n, &M);
for (int i = ; i <= n; i++)
scanf("%d", ar + i);
} ull fquery(int l, int r) { // forward
if (l > r)
return ;
return ph[r] - ph[l - ] * pb[r - l + ];
} ull rquery(int l, int r) { // backward
if (l > r)
return ;
return sh[l] - sh[r + ] * pb[r - l + ];
} boolean ispar(int l, int r) {
return fquery(l, r) == rquery(l, r);
} vector<int> vec; inline void solve() {
ph[] = , sh[n] = , pb[] = ;
for (int i = ; i < n; i++)
ph[i] = ph[i - ] * base + (cr[i] = ar[i + ] - ar[i]);
for (int i = n - ; i; i--)
sh[i] = sh[i + ] * base + cr[i];
for (int i = ; i < n; i++)
pb[i] = pb[i - ] * base; for (int i = , x; i < n; i++) {
x = ar[] + ar[i];
// if (x >= M)
// break;
if (add(ar[i + ], ar[n]) == x && ispar(, i - ) && ispar(i + , n - ))
vec.push_back(x);
}
int x = add(ar[], ar[n]);
if ((x <= ar[] || x >= ar[n]) && ispar(, n - ))
vec.push_back(x);
printf("%d\n", (signed) vec.size());
sort(vec.begin(), vec.end());
for (int i = ; i < (signed) vec.size(); i++)
printf("%d ", vec[i]);
putchar('\n');
} int main() {
init();
solve();
return ;
}

最新文章

  1. Highcharts中国地图热力图
  2. SQLServer2008设置 开启远程连接
  3. unity, 只发射一个粒子的粒子系统
  4. Shell编程菜鸟基础入门笔记
  5. Create a Listlink
  6. 批量修改Project视图中Prefab的名字
  7. c# List&lt;int&gt; 转 string 以及 string [] 转 List&lt;int&gt;
  8. appium的安装过程(图文界面)
  9. jquery JS 左右方向键
  10. WordPress搭建Personal Blog【转】
  11. UISwitch 开关控件
  12. Struts加入拦截器后取不到页面参数
  13. 201521123067 《Java程序设计》第14周学习总结
  14. 经典面试题: 从输入URL到页面加载的过程发生了什么?
  15. python基础知识4--数据类型与变量
  16. java-学习3(jdk-环境配置)
  17. 镜像仓库管理:与Portus不得不说的那些事
  18. sql的执行流程
  19. IE10中KendoUI treeview 点击后出现虚线框的解决方案
  20. R中字符串操作

热门文章

  1. filter的知识点 和 实例
  2. linux的基本操作(RPM包或者安装源码包)
  3. Ubantu 好玩以及有用的命令
  4. 下载JDK开发工具包
  5. 【MySQL】锁——查看当前数据库锁请求的三种方法 20
  6. 9 个用于移动APP开发的顶级 JavaScript 框架【申明:来源于网络】
  7. Codeforces 1062 - A/B/C/D/E - (Undone)
  8. HomeBrew及HomeBrew Cask的简介和使用
  9. MongoDB常用操作--简介
  10. java框架之SpringBoot(11)-缓存抽象及整合Redis