zoukankan      html  css  js  c++  java
  • 子序列个数(fzu2129)

    子序列个数

    Time Limit:2000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u

    Description

    子序列的定义:对于一个序列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,请输出不同的子序列的个数。(由于答案比较大,请将答案mod 1000000007)

    Input

    输入包含多组数据。每组数据第一行为一个整数n(1<=n<=1,000,000),表示序列元素的个数。

    第二行包含n个整数a[i] (0<=a[i]<=1,000,000)表示序列中每个元素。

    Output

    输出一个整数占一行,为所求的不同子序列的个数。由于答案比较大,请将答案mod 1000000007。

    Sample Input

    4 1 2 3 2

    Sample Output

    13

    Hint

    其中40%数据点1<=n<=1000。
     
     
    #include<stdio.h>  
      
    const __int64 mod=1000000007;  
    __int64 dp[1000005],k[1000005];  
    bool have[1000005];  
    int main()  
    {  
        int n,a;  
        while(scanf("%d",&n)>0)  
        {  
            for(int i=0; i<=1000001; i++)  
            {  
                dp[i]=k[i]=0;  
                have[i]=0;  
            }  
            for(int i=1; i<=n; i++)  
            {  
                scanf("%d",&a);  
                int flag=0;  
                if(!have[a])  
                    have[a]=1,flag=1;  
                dp[i]=(dp[i-1]*2-k[a]+flag+mod)%mod;  
                k[a]=dp[i-1];//为了下次出现的a无需再与1~(i-1)的范围内的数组合,因为1~(i-1)的范围内的数与下次出现的a 给合就等价于与当前a组合  
            }  
            printf("%I64d
    ",dp[n]);  
        }  
    }  
     
     
     
  • 相关阅读:
    Moss2010 部署命令
    socket形象描述
    Android UI 的更新
    android AIDL 进程间通信
    中文设置成粗体的方法
    android 主件之 Service
    android activity
    拦截Activity的后退键处理
    android 解析json数据格式
    防止事件导致的oncreate的多次调用
  • 原文地址:https://www.cnblogs.com/yuyixingkong/p/4376666.html
Copyright © 2011-2022 走看看