子序列的定义:对于一个序列a=a[1],a[2],……a[n]。则非空序列a’=a[p1],a[p2]……a[pm]为a的一个子序列,其中1< =p1< p2 <….. < pm <=n。
例如4,14,2,3和14,1,2,3都为4,13,14,1,2,3的子序列。对于给出序列a,有些子序列可能是相同的,这里只算做1个,请输出a的不同子序列的数量。由于答案比较大,输出Mod 10^9 + 7的结果即可。
Input
第1行:一个数N,表示序列的长度(1 <= N <= 100000)
第2 - N + 1行:序列中的元素(1 <= a[i] <= 100000)
Output
输出a的不同子序列的数量Mod 10^9 + 7。
Input示例
4
1
2
3
2
Output示例
13
题解
dp[i]表示到i为止有多少个逆序对,记录一下前一个相同的数出现的位置。
代码
#include<bits/stdc++.h>
#define N 500005
#define ll long long
#define inf 100000000
#define mod 1000000007
using namespace std;
inline int read()
{
int x=0,f=1;char ch=getchar();
while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
while (ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
return x*f;
}
int n,dp[100005],last[100005];
int main()
{
n=read();
for (int i=1;i<=n;i++)
{
int x=read();
dp[i]=(dp[i-1]*2+1)%mod;
if (last[x]) dp[i]=((dp[i]-1-dp[last[x]-1])%mod+mod)%mod;
last[x]=i;
}
printf("%d",dp[n]);
return 0;
}