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. Oracle游标或存储过程

    /* 方式1:可执行选取代码块允许 */ declare cursor cur_tmp is ( select '' as tmp_status from dual ); begin for tmp_ ...

  2. vmware网络故障处理

    1.基本情况,更新vmware后发现联不上ssh了.查看物理机和虚拟机的ip,使用ping命令发现 虚拟机可以ping物理机且有网络 但是物理机是无法ping虚拟机的 2.网络的教程整理了,各有问题, ...

  3. delphi 给 Timage 加上滚动条方法

    delphi Timage 加上滚动条的方法 1:将  Timage 放入 TScrollBox内,即   [1]设image1.parent:= ScrollBox1;   [2]在Object I ...

  4. 简单的helloworld指令

    Hello World指令 1.下载安装notepad++ 2.新建文本文档 3.鼠标右键单击Edit with Noteapd++ 编辑程序并保存 public class hello{ publi ...

  5. 解决Vue打包后背景图片路径错误问题(转)

    1.原因解析 当用vue-cli自动构建项目后,有两种运行方法,分别是: npm run dev : 提供一个开发的环境,自动热更新,资源使用绝对路径,所以可以正常看到背景图片. npm run bu ...

  6. 修改密码 MVC

    控制器site public function actionPassword(){ $model = new PasswordForm(); /*判断请求属性 if ($request->isA ...

  7. swagger 增强UI --knife4j

    knife4j 文档:  https://gitee.com/xiaoym/knife4j (1)简介 knife4j是为Java MVC框架集成Swagger生成Api文档的增强解决方案,前身是sw ...

  8. Python内置函数:index

    index用于返回指定值在序列的第一个位置 序列.index(值,开始索引,结束索引) 开始索引默认为0,可不传 结束索引默认为序列长度,可不传 >>> str = 'abc' &g ...

  9. PHP 文件和文件夹操作

    文件夹操作 创建文件夹 mkdir(名称,权限,递归创建):创建文件 例如: #创建文件夹 mkdir('./aa') # 创建 aa 文件夹 mkdir('./aa/bb') # 在 aa 目录下创 ...

  10. Python学习笔记--文件的相关操作

    文件的读取操作 读操作 实现: read()--读完 read(10)--读取10个字节 readline()--将所有行并到一行输出 readlines()--一次读取一行 文件的关闭: 实现: 上 ...