首页 > 其他分享 >abc370E Avoid K Partition

abc370E Avoid K Partition

时间:2024-10-07 17:59:50浏览次数:8  
标签:std int Avoid Partition abc370E i64 MInt sum dp

有长度为N的数组A[i]和整数K,需要将A划分成连续子数组,要求每个子数组之和不能为K。问有多少种方案,答案对998244353取模。

分析:如果不考虑和不为K的限制,就是个O(n^2)的dp,通过前缀和可以优化成O(n)。现要求子数组和不为K,可以用容斥思想先全部加上,然后减去不符合条件的。

#include <bits/stdc++.h>
using i64 = long long;

template<int MOD>
struct MInt {
    i64 x;
    int norm(i64 u) const {u%=MOD; if(u<0) u+=MOD; return u;}
    MInt(i64 v=0):x(norm(v)) {}
    int val() const {return x;}
    MInt operator-() const {return MInt(norm(MOD-x));}
    MInt inv() const {assert(x!=0); return power(MOD-2);}
    MInt &operator*=(const MInt &o) {x=norm(x*o.x); return *this;}
    MInt &operator+=(const MInt &o) {x=norm(x+o.x); return *this;}
    MInt &operator-=(const MInt &o) {x=norm(x-o.x); return *this;}
    MInt &operator/=(const MInt &o) {*this *= o.inv(); return *this;}
    friend MInt operator*(const MInt &a, const MInt &b) {MInt ans=a; ans*=b; return ans;}
    friend MInt operator+(const MInt &a, const MInt &b) {MInt ans=a; ans+=b; return ans;}
    friend MInt operator-(const MInt &a, const MInt &b) {MInt ans=a; ans-=b; return ans;}
    friend MInt operator/(const MInt &a, const MInt &b) {MInt ans=a; ans/=b; return ans;}
    friend std::istream &operator>>(std::istream &is, MInt &a) {i64 u; is>>u; a=MInt(u); return is;}
    friend std::ostream &operator<<(std::ostream &os, const MInt &a) {os<<a.val(); return os;}
    MInt power(i64 b) const {i64 r=1, t=x; while(b){if(b&1) r=r*t%MOD; t=t*t%MOD; b/=2;} return MInt(r);}
};
using mint = MInt<998244353>;

void solve() {
	i64 N, K;
	std::cin >> N >> K;
	std::vector<i64> A(N + 1), B(N + 1);
	for (int i = 1; i <= N; i++) {
		std::cin >> A[i];
	}
	std::partial_sum(A.begin(), A.end(), B.begin());

	mint sum = 0;
	std::map<i64,mint> cnt;
	std::vector<mint> dp(N + 1);
	dp[0] = cnt[0] = sum = 1;
	for (int i = 1; i <= N; i++) {
		dp[i] = sum - cnt[B[i] - K];
		sum += dp[i];
		cnt[B[i]] += dp[i];
	}
	std::cout << dp[N] << "\n";
}

int main() {
	std::cin.tie(0)->sync_with_stdio(0);
	int t = 1;
	while (t--) solve();
	return 0;
}

标签:std,int,Avoid,Partition,abc370E,i64,MInt,sum,dp
From: https://www.cnblogs.com/chenfy27/p/18450386

相关文章

  • CF2019C Cards Partition
    涉及知识点:鸽巢原理,贪心前言唐诗题,赛时都已经想到了所有性质,以为要从数学方法上求解,却没想到就是个纯贪心题……题意Link给你一堆数,\(1,2,3,\dots,n\),分别有\(a[1],a[2],a[3],\dots,a[n]\)个,你还可以添加不超过\(k\)个数(当然这些数得是\(1\simn\)中的整数),你需要将它们......
  • 题解 ARC118E【Avoid Permutations】/ SS240928D【d】
    题目描述对于一个排列\(a\),定义其权值如下:生成一个\((n+2)\times(n+2)\)的网格图,行列标号为\(0∼n+1\),每次可以从\((i,j)\)走到\((i,j+1)\)或\((i+1,j)\),且不能走到\((i,a_i)\),权值为从\((0,0)\)走到\((n+1,n+1)\)的方案数。现在排列\(......
  • A Fast and High Quality Multilevel Scheme for Partitioning Irregular Graphs
    目录概METISCoarseningPartitioningphaseUncoarseningphaseKarypisG.andKumarV.Afastandhighqualitymultilevelschemeforpartitioningirregulargraphs.SIAM,1998.概本文提出了一种multilevelgraphpartitioning方法.METISMETIS的思想比较简单:......
  • Graph Edge Partitioning via Neighborhood Heuristic
    目录概符号说明VertexvsEdgepartitioningNE(NeighborExpansion)代码ZhangC.,WeiF.,LiuQ.,TangZ.G.andLiZ.Graphedgepartitioningvianeighborhoodheuristic.KDD,2017.概本文提出了一种图分割方法(edgepartitioning),保证只有少量的重复结点.符号......
  • 开机出现invalid partition table原因分析及解决方法
         最近有网友问我为什么电脑开机每次出现invalidpartitiontable,这个提示意思是:无效的分区表。原因有很多,比如我们采用的是uefi引导,而第一启动的硬盘是MBR分区,比如我们采用的是legacy引导模式,而第一启动项的硬盘为gpt分区等,下面我们来详细分析一下每次开机提示inva......
  • Vue, Avoided redundant navigation to current location: "/login".
    VueAvoidedredundantnavigationtocurrentlocation:"/login".=================================报错解释:这个错误是在使用Vue.js框架时,发生的一个警告,表示尝试进行一个冗余的导航到当前位置(即“/login”路径)。这通常发生在VueRouter中,当你尝试通过编程方式导航到当前正......
  • Luogu P10997 Partition 题解 [ 蓝 ] [ 轮廓 dp ]
    Partition:一道dp神题,用到了以轮廓线的轨迹来做dp的技巧,和敲砖块这题的状态设计有点相似。观察首先观察样例,发现整张图可以看作是被两条线分隔开的。同时每个颜色的四个方向上又存在一大堆奇怪的性质,很容易发现这两条线一条是从左上到右下的线,另一条是从右下到左上的线。暴......
  • kafka如何合理设置broker、partition、consumer数量
    目录1.broker的数量最好大于等于partition数量2.consumer数量最好和partition数量一致3.总结1.broker的数量最好大于等于partition数量一个partition最好对应一个硬盘,这样能最大限度发挥顺序写的优势。一个broker如果对应多个partition,需要随机分发,顺序IO会退化成随机IO。实......
  • AT_code_festival_2017_qualc_d - Yet Another Palindrome Partitioning 题解
    YetAnotherPalindromePartitioning题解题目大意给出一个字符串,求把这个字符串划分成最少的小段,使每个小段都可以经过字母重组后为回文串。题目分析如果暴力的话,需要DFS段数、每一段的左节点、右节点,以及判断是否为回文串,时间复杂度在\(O(|S|^{|S|})\)左右。但是本......
  • 【Oracle点滴积累】解决ORA-06183 unable to extend index SYS.WRH$_SYSMETRIC_HISTOR
    广告位招租!知识无价,人有情,无偿分享知识,希望本条信息对你有用!今天和大家分享ORA-06183unabletoextendindexSYS.WRH$_SYSMETRIC_HISTORY_INDEXpartition错误的解决方法,本文仅供参考,谢谢!Solution:SELECTTABLESPACE_NAME,FILE_NAME,BYTES/1024/1024FILE_SIZE,AUTO......