首页 > 其他分享 >[ABC207E] Mod i 题解

[ABC207E] Mod i 题解

时间:2023-06-05 13:36:41浏览次数:41  
标签:int 题解 sum ABC207E 划分 include bmod Mod

Mod i

题目大意

给定一个序列 \(a\),问将其划分成若干段,满足第 \(i\) 段的和是 \(i\) 的倍数的划分方案的个数。

思路分析

考虑 DP,设 \(f_{i,j}\) 表示将序列中前 \(i\) 个数划分成 \(j\) 段,且满足条件的划分方案的个数,容易得出状态转移方程:

\[f_{i,j}=\sum f_{k,j-1}(\sum_{h=k+1}^i a_i\bmod j=0) \]

直接转移的复杂度是 \(O(n^3)\) 的,无法接受,考虑优化。

设 \(s_i\) 为 \(a\) 的前 \(i\) 项和,那么约束条件等价于 \((s_i-s_k) \bmod j=0\),当条件成立时有 \(s_i\equiv s_k \pmod j\)。

可以设 \(g_{i,j}=\sum f_{k,i}(s_k\bmod (i+1)=j)\),那么容易发现

\[g_{j-1,s_i\bmod j}=\sum f_{k,j-1}(s_k\bmod j=s_i\bmod j)= f_{i,j} \]

这样转移就优化到了 \(O(n^2)\),这是因为 \(g\) 可以在转移时累加,即

\[g_{j,s_i\bmod (j+1)}=\sum f_{k,j}(s_k\bmod (j+1)=s_i\bmod(j+1)) \]

其中包含 \(f_{i,j}\)。

代码

#include <iostream>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <cstdio>

using namespace std;
const int N=3200,mod=1000000007;
#define int long long

int f[N][N],g[N][N];
int sum[N],a[N];
int ans,n;

signed main(){
    scanf("%lld",&n);
    for(int i=1;i<=n;i++){
        scanf("%lld",&a[i]);
        sum[i]=sum[i-1]+a[i];
    }
    f[0][0]=g[0][0]=1;//初始条件
    for(int i=1;i<=n;i++)
        for(int j=n;j>=1;j--){
            f[i][j]=g[j-1][sum[i]%j];
            g[j][sum[i]%(j+1)]=(g[j][sum[i]%(j+1)]+f[i][j])%mod;
        }
    for(int i=1;i<=n;i++) ans=(ans+f[n][i])%mod;//累加答案
    cout<<ans<<'\n';
    return 0;
}

标签:int,题解,sum,ABC207E,划分,include,bmod,Mod
From: https://www.cnblogs.com/TKXZ133/p/17457546.html

相关文章

  • [ABC205E] White and Black Balls 题解
    WhiteandBlackBalls题目大意将\(n\)个白球,\(m\)个黑球排成一列,要求满足\(\foralli\in[1,n+m],w_i\leb_i+k\),问存在多少种排法。其中\(w_i\)表示第\(i\)个球前的白球数量,\(b_i\)表示第\(i\)个球前的黑球数量。思路分析我们可以将一种排法映射成一条从\((0,0)......
  • [ABC205F] Grid and Tokens 题解
    GridandTokens题目大意给定\(n\)个点和一个\(H\timesW\)的网格,每个点可以放置在\((A_i,B_i)\)到\((C_i,D_i)\)的矩形中或不放,每一行或一列只能放置一个点,求最多能放多少个点。思路分析首先看数据范围,再结合题目给的限制条件,容易发现这是一道网络流。考虑建图,因为......
  • [ABC201E] Xor Distances 题解
    XorDistances题目大意给定一颗带边权无根树,定义\(\text{dis}(i,j)\)表示\(i,j\)两点在树上的最短路径的边权的异或和。求:\[\sum_{i=1}^n\sum_{j=i+1}^n\text{dis}(i,j)\]思路分析首先,容易证明:\[\text{dis}(i,j)=\text{dis}(i,x)\oplus\text{dis}(x,j)\]这个式子告诉我......
  • [ABC202E] Count Descendants 题解
    CountDescendants题目大意给定一颗以\(1\)为根的树,多次询问求某点的子树中深度为给定值的点的个数。思路分析对于每个深度开一个vector,从大到小存下这个深度的所有点的dfs序开始值和结束值,询问时只需要在对应深度的vector中二分作差即可。代码#include<iostream>#......
  • [ABC204E] Rush Hour 2 题解
    RushHour2题目大意给定一张无向图,边带两个参数\(c_i,d_i\),在\(t\)时间时经过第\(i\)条边所需的时间是\(c_i+\lfloor\frac{d_i}{t+1}\rfloor\),求在时间\(0\)时出发,在每个点可以停留非负整数时间,从点\(1\)到点\(n\)所需的最短时间。思路分析首先,容易发现在时间\(......
  • P2487 拦截导弹 题解
    拦截导弹题目大意给定若干元素,每个元素有\(3\)个属性\(t_i,h_i,v_i\),求出一个使得对于\(\foralli,j,i>j\),\(t_i>t_j,h_i\leh_j,v_i\lev_j\)均成立的最长的子序列\(a\)的长度。并计算每个元素在所有的可能的\(a\)方案中的出现概率。思路分析先看第一个问题:按\(......
  • P5012 水の数列 题解
    水の数列题目大意对于给定的数列\(a\),选择一个数\(x\),定义其得分为数列中所有小于等于\(x\)的数形成的若干个连续区间的平方和除以\(x\)所得到的数。现进行多次询问,每次询问给定两个数\(l,r\),要求出一个得分最大的\(x\),满足数列中所有小于等于\(x\)的数形成的若干个......
  • [ABC201D] Game in Momotetsu World 题解
    GameinMomotetsuWorld题目大意在一个\(n\timesm\)的网格中,存在红色和蓝色两种格子,红色格子用-表示,蓝色格子用+表示。现在Takahashi和Aoki要在这个网格中进行游戏,游戏的规则如下:初始时,有一枚棋子摆放在左上角,即\((1,1)\)的位置。两名玩家的分数均为\(0\)。......
  • P2048 超级钢琴 题解
    超级钢琴题目大意求出序列中长度在\([L,R]\)中的所有区间的区间和前\(k\)大的区间的区间和。思路分析暴力做法是把所有符合条件的区间扔进堆里,再弹出\(k\)个,时间复杂度\(O((n^2+k)\logn)\),可以拿到\(20\text{pts}\)的好成绩。但真的有必要全部加进去吗?不!我们设五......
  • P5445 路灯 题解
    路灯题目大意在\(n+1\)个站点之间有\(n\)盏路灯,给定\(0\)时刻所有路灯的亮灭情况,在接下来的\(q\)个时刻,每时刻会发生以下两种事件之一:切换某一盏路灯的亮灭。询问两点之间存在多少时刻使得两点之间的路灯全部亮起。思路分析一道不错的数据结构。首先分析题目......