题目描述
给定序列A,求出A中本质不同的子序列(包含空的子序列)个数模109+7的结果.
一个序列B是A的子序列需要满足A删掉某些元素后能够得到B.
两个子序列中对应位置的数都相同我们就认为这两个子序列本质相同.
输入
第一行包含一个整数N,代表序列的长度.接下来一行N个整数,第i个数代表Ai.
输出
输出一个整数代表答案。
样例输入
5
2 3 1 3 2
样例输出
27
刚听了大佬讲解,感觉昨天晚上的2个小时都没a出来实在是……
两个数组分别存:1. 以x为结尾的数的序列个数。 2. 1-i(位置)的子系列的个数
单纯的说没啥意思,直接给组测试实例分析一下吧(以题目样例为例)
-------1 2 3 4 5(位置)
-------2 3 1 3 2(x)
a[x] 1 1+1 3+1 7+1 13+1
b[i] 1 1+2 3+4 7+8-2 27—1
最后还有一个空的序列,so……
代码;
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAX=1e6+10;
const ll mod=1e9+7;
ll a[MAX],b[MAX];
int main()
{
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
int x;
ll sum=0;
scanf("%d",&x);
if(i==1)
{
a[x]=1;
b[i]=1;
}
else
{
if(a[x]!=0)
{
sum=a[x];