#1475 : 数组分拆

#1475 : 数组分拆

时间限制:10000ms

单点时限:1000ms

内存限制:256MB

描述

小Ho得到了一个数组作为他的新年礼物,他非常喜欢这个数组!

在仔细研究了几天之后,小Ho成功的将这个数组拆成了若干段,并且每段的和都不为0!

现在小Ho希望知道,这样的拆分方法一共有多少种?

两种拆分方法被视作不同,当且仅当数组断开的所有位置组成的集合不同。

输入

每组输入的第一行为一个正整数N,表示这个数组的长度

第二行为N个整数A1~AN,描述小Ho收到的这个数组

对于40%的数据,满足1<=N<=10

对于100%的数据,满足1<=N<=105, |Ai|<=100

输出

对于每组输入,输出一行Ans,表示拆分方案的数量除以(109+7)的余数。

样例输入
5
1 -1 0 2 -2
样例输出
5分析:dp[i]代表前i个数方案,sum[i]代表前缀和i;   dp[i]=∑dp[j](1<=j<i)-∑dp[k](1<=k<i&&sum[k]==sum[i]);代码:
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#include <climits>
#include <cstring>
#include <string>
#include <set>
#include <bitset>
#include <map>
#include <queue>
#include <stack>
#include <vector>
#define rep(i,m,n) for(i=m;i<=n;i++)
#define mod 1000000007
#define inf 0x3f3f3f3f
#define vi vector<int>
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define ll long long
#define pi acos(-1.0)
#define pii pair<int,int>
#define sys system("pause")
const int maxn=1e5+10;
const int N=1e3+10;
using namespace std;
ll gcd(ll p,ll q){return q==0?p:gcd(q,p%q);}
ll qpow(ll p,ll q){ll f=1;while(q){if(q&1)f=f*p;p=p*p;q>>=1;}return f;}
int n,m,k,t,a[maxn];
ll sum,dp[maxn];
map<int,ll>p;
int main()
{
    int i,j;
    p[0]=1;
    scanf("%d",&n);
    rep(i,1,n)scanf("%d",&a[i]),a[i]+=a[i-1];
    rep(i,1,n)
    {
        dp[i]+=sum+1;
        dp[i]-=p[a[i]];
        (dp[i]+=mod)%=mod;
        sum+=dp[i];
        sum%=mod;
        p[a[i]]+=dp[i];
        p[a[i]]%=mod;
    }
    printf("%lld\n",dp[n]);
    return 0;
}

时间: 2024-10-06 08:35:22

#1475 : 数组分拆的相关文章

hihocoder 1475数组分拆

#1475 : 数组分拆 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Ho得到了一个数组作为他的新年礼物,他非常喜欢这个数组! 在仔细研究了几天之后,小Ho成功的将这个数组拆成了若干段,并且每段的和都不为0! 现在小Ho希望知道,这样的拆分方法一共有多少种? 两种拆分方法被视作不同,当且仅当数组断开的所有位置组成的集合不同. 输入 每组输入的第一行为一个正整数N,表示这个数组的长度 第二行为N个整数A1~AN,描述小Ho收到的这个数组 对于40%的数据,满足1

POJ 3422 矩阵取数 最小费用流拆点+负边

Kaka's Matrix Travels Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 9153   Accepted: 3696 Description On an N × N chessboard with a non-negative number in each grid, Kaka starts his matrix travels with SUM = 0. For each travel, Kaka mo

走进Groovy (二)

承接上一篇,配置好环境后,开始正式学习语法.我假设看此文的同学至少会一定的JAVA语法,因此一些太过基础的就不记录了,基本上,大家看看示例就明白了. Groovy的卖点之一,就是全兼容JAVA的语法,因此你完全可以从一个JAVA文件中把源代码复制到一个Groovy文件中而不必改写任何一个字直接运行,不过这样在groovy中写JAVA就没意思了,享受不到groovy带来的乐趣了. 一个groovy文件,并非像java文件一样,必须要定义一个类且文件名必须和类名一样,groovy文件中,你可以同时定

【这几天做到的区间问题】

1,数组分拆: 给定数组,问有多少种拆分法,使得每一段和不为0. (1e5) 2,数组区间: 求所有区间第k大的和. (1e5,k<=50) 3,数组分拆II:给定数组,问有多少种拆法,使得每一段不出现重复的数字.(1e5) 4,有趣的子区间:给定a<=b求,问有多少对p,q,满足a<=p<=q<=b,使得区间[p,q]是有趣区间.有趣区间是指包含偶数个回文数.(1e10) 原文地址:https://www.cnblogs.com/hua-dong/p/8452988.htm

第二类斯特林数

含义 \(n\)个有区别的球放在\(m\)个相同的盒子内,要求盒子不为空的方案数 实际上也就是把数\(n\)拆成\(m\)个正整数和的方案数 记作\(S(n, m)\) 性质 \(S(n, 0)=S(0, n)=0\),其中\(n \in N\) \(S(n, k)=0\),其中\(k>n>=1\) \(S(n, n)=S(n, 1)=1\),其中\(n>=1\) 等等...... 求法 递推 \[S(n, m) = S(n - 1, m - 1) + S(n - 1, m) * m\]

刨根究底字符编码之十四——UTF-16究竟是怎么编码的

UTF-16究竟是怎么编码的 1. 首先要注意的是,代理Surrogate是专属于UTF-16编码方式的一种机制,UTF-8和UTF-32是不用代理的. 如前文所述,为了让UTF-16能继续编码基本平面后面的增补平面中的码点值,于是扩展了UTF-16编码方式. 具体的扩展方法就是为其增加了代理机制,用两个对应于基本平面码点(即BMP代理区中的码点)的16位码元来表示一个增补平面码点,这两个用来表示一个增补平面码点的特殊16位码元就被称为"代理对". 如果要用简单的一句话来概括,就是--

20200225 Java 多线程(2)-廖雪峰

Java 多线程(2)-廖雪峰 使用wait和notify 在Java程序中,synchronized解决了多线程竞争的问题.例如,对于一个任务管理器,多个线程同时往队列中添加任务,可以用synchronized加锁: class TaskQueue { Queue<String> queue = new LinkedList<>(); public synchronized void addTask(String s) { this.queue.add(s); } } 但是syn

【BZOJ-1974】auction代码拍卖会 DP + 排列组合

1974: [Sdoi2010]auction 代码拍卖会 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 305  Solved: 122[Submit][Status][Discuss] Description 随着iPig在P++语言上的造诣日益提升,他形成了自己一套完整的代码库.猪王国想参加POI的童鞋们都争先恐后问iPig索要代码库.iPig不想把代码库给所有想要的小猪,只想给其中的一部分既关系好又肯出钱的小猪,于是他决定举行了一个超大型拍

划分数系列问题

整数划分 --- 一个老生长谈的问题: 1) 练练组合数学能力. 2) 练练递归思想 3) 练练DP 总之是一道经典的不能再经典的题目: 这道好题求: 1. 将n划分成若干正整数之和的划分数. 2. 将n划分成k个正整数之和的划分数. 3. 将n划分成最大数不超过k的划分数. 4. 将n划分成若干奇正整数之和的划分数. 5. 将n划分成若干不同整数之和的划分数. 1.将n划分成不大于m的划分法: 1).若是划分多个整数可以存在相同的:  dp[n][m]= dp[n][m-1]+ dp[n-m]