CF1738EBalance Addicts

原题: CF1738EBalance Addicts

题目大意

有\(n\)个数的数列,把它分成若干个子集,保证所有子集的和能够组成一个回文数列,求\(mod\ 998244353\)后的方案数。

做法

思路

先分别从头和尾找到一段序列的和相同,记为\(l1\ r2\)然后从\(l1\ r2\)开始寻找一段最长的和相等的序列记为\(r1\ l2\)。

此时答案为

\[ans *= \sum_{i = 0}^{min(r1 - l1 + 1 , r2 - l2 + 1)}C_{r1 - l1 + 1}^i * C_{r2 - l2 + 1}^i
\]

注意

1、如果此时\(l1\ r2\)之间的数都为\(0\)。

显然:\(l1\ r2\)之间的数都可以随便选,那么将\(ans *= 2^{r2 - l1 + 1}\)即可退出

2、预处理\(sum1\ sum2\ tpow\)表示前缀和、后缀和、2的\(n\)次方

3、记得\(mod\ 998244353\)

code

#include<bits/stdc++.h>
using namespace std;
const int N = 1e5 + 5;
const long long mod = 998244353;
int n;
long long ans , ans1 , sum1[N + 5] , sum2[N + 5] , fac[N + 5] , inv[N + 5] , tpow[N + 5] , a[N + 5];
long long pw(long long x , long long y) {
if(!y)
return 1;
long long z = pw (x , y / 2);
z = z * z % mod;
if(y & 1)
z = z * x % mod;
return z;
}
void pre() {
fac[1] = fac[0] = 1;
for(int i = 2 ; i <= N ; i++) {
fac[i] = fac[i - 1] * i % mod ;
}
inv[N] = pw (fac[N] , mod - 2);
for(int i = N - 1 ; i >= 0 ; i--) {
inv[i] = inv[i + 1] * (i + 1) % mod;
}
tpow[0] = 1;
for (int i = 1 ; i <= N ; i++)
tpow[i] = tpow[i - 1] * 2 % mod;
}
long long C(int x , int y) {
if(x<0||y<0) return 0;
if(x < y)
return 0;
return fac[x] * inv[y] % mod * inv[x - y] % mod;
}
int main () {
pre ();
int T;
scanf ("%d" , &T);
while (T--) {
ans = 1;
scanf ("%d" , &n);
for (int i = 1 ; i <= n ; i++) {
scanf ("%d" , &a[i]);
}
for (int i = 1 ; i <= n ; i++) {
sum1[i] = sum1[i - 1] + a[i];
}
for (int i = n - 1; i >= 1 ; i--) {
sum2[i] = sum2[i + 1] + a[i + 1];
}
for (int l1 = 1 , r2 = n - 1 , l2 , r1; l1 <= r2 ; l1 = r1 + 1 , r2 = l2 - 1) {
while (l1 <= r2 && sum1[l1] != sum2[r2]) {
if(sum1[l1] < sum2[r2])
l1 ++;
else
r2 --;
}
if (l1 > r2)
break;
if (sum1[l1] == sum1[r2]) {
ans = tpow[r2 - l1 + 1] * ans % mod;
break;
}
r1 = l1 , l2 = r2;
while (sum1[r1 + 1] == sum1[l1])
r1 ++;
while (sum2[l2 - 1] == sum2[r2])
l2 --;
ans1 = 0;
for (int i = 0 ; i <= min(r1 - l1 + 1 , r2 - l2 + 1) ; i++) {
ans1 = (ans1 + (C (r1 - l1 + 1 , i) * C (r2 - l2 + 1 , i) %mod) ) %mod;
}
ans = ans * ans1 % mod;
}
printf("%lld\n" , ans);
for (int i = 1 ; i <= n ; i++)
sum1[i] = sum2[i] = 0;
}
return 0;
}

CF1738EBalance Addicts的更多相关文章

  1. java运算符优先级记忆口诀

    尊重原创:(口诀)转自http://lasombra.iteye.com/blog/991662 今天看到<java编程思想>中的运算符优先级助记口诀,不过"Ulcer Addi ...

  2. zoj 1010 (线段相交判断+多边形求面积)

    链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=10 Area Time Limit: 2 Seconds      Mem ...

  3. How good software makes us stupid?

    How good software makes us stupid? 科技是怎样让人变傻的? People assume that iPhones, laptops and Netflix are e ...

  4. zoj 1010 Area【线段相交问题】

    链接: http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1010 http://acm.hust.edu.cn/vjudge/ ...

  5. L268 A terrifying look at the consequences of climate change

    Climate change is a devilish problem for humanity: at once urgent and slow-moving, immediate and dis ...

  6. Why I Left the .NET Framework

    The .NET Framework was good. Really good. Until it wasn't. Why did I leave .NET? In short, it constr ...

  7. 每日英语:How Often Do Gamblers Really Win?

    The casino billboards lining America's roadways tantalize with the lure of riches. 'Easy Street. It' ...

  8. Social media users of the world unite!

    Social media users of the world unite!全世界社交媒体用户联合起来!If Plato were alive today, he might well regard ...

  9. TEXT 8 Ready, fire, aim

    TEXT 8 Ready, fire, aim 预备!开火!瞄准!! Feb 16th 2006 From The Economist print edition Foreword:A vice-pr ...

  10. 【256】◀▶IEW-答案

    附答案 Unit I Fast food Model Answers: Model 1 The pie chart shows the fast foods that teenagers prefer ...

随机推荐

  1. linux-minicom

    q:只能发送不能接收 a:串口设置,硬件流控制=>NO

  2. CentOS7-mysql5.7.35安装配置

    一.下载网址 注:mysql从5.7的某个版本之后之后不再提供my-default.cnf文件,不耽误启动,想要自定义配置可以自己去/etc下创建my.cnf文件 全版本:https://downlo ...

  3. Blob、FormData

    Blob 在我的理解中这个就是一个二进制的存储类型,就像一张图片就是一组二进制,很多文件都是一组二进制.这个就是数据库用来存储二进制类型. FormData 为什么使用 FormData 来进行数据的 ...

  4. java锁之初相见

    废话不多说,先上锁的分类图 1.乐观锁&悲观锁 悲观锁 悲观锁认为自己在使用数据的时候一定有别的线程来修改数据,因此在获取数据的时候会先加锁,把别的线程阻塞住,最终确保数据不会被别的线程修改. ...

  5. 1.java基本语法

    一.数据和数据类型 (一)标识符:给变量.常量.方法类.对象等命名的符号 (二)变量和常量 1.变量:值在运行时可以改变的量: 每个变量属于特定的数据类型,使用前要先声明,然后赋值,初始化或赋值后才能 ...

  6. 安装node.js教程------深入使用Vue

    教程 1.下载nodejs引擎 网址:https://nodejs.org/en/download/ 选择32-bit或者64-bit都行 2.下载最新版npm.zip压缩包 网址:http://no ...

  7. Jetson Xavier NX 试玩 (二)

    Jetson Xavier NX 试玩 (二) Hello AI World Inference 人工智能推理模型 0 前言 想玩一玩 jetson 的人工智能功能,官方的 instructional ...

  8. 自己动手从零写桌面操作系统GrapeOS系列教程——13.向MBR中写入程序

    学习操作系统原理最好的方法是自己写一个简单的操作系统. 前面铺垫了这么久,今天终于开始写程序了.本讲将介绍3个逐步深入但非常简单的程序,一方面是让大家熟悉开发流程,另一方面是顺便解决前面遇到的CPU占 ...

  9. 通过 poe 免费使用ChatGPT、GPT-4

    poe 是由美版知乎 Quora 构建的AI 产品,提供实时在线与多个AI 机器人交流.Quora 于去年 12 月首次推出Poe 作为封闭测试版,并于2月份向所有 iOS 用户开放.支持 web 端 ...

  10. gulp中解决es5转es6的方法

    1:安装配置文件: cnpm i gulp-babel@7 babel-core -D  (@7是因为要使 "gulp-babel": "^7.0.1" 与&q ...