fzu—— Problem 2129 子序列个数

2024-06-09 05:18
文章标签 fzu problem 2129 个数 序列

本文主要是介绍fzu—— Problem 2129 子序列个数,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Problem 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

分析:若第k个数与前k-1个数都不同的话,则的d[k]=2*d[k-1]+1;

     否则d[k-1]=2*d[k-1]-d[p[a]-1]

#include <iostream>
#include <stdio.h>
#include <cstring>
#define M 1000008
#define modc 1000000007
using namespace std;
int a[M],p[M];
int main()
{
int n,b;
while(scanf("%d",&n)==1)
{
memset(p,0,sizeof(p));
a[0]=0;		
for(int i=1;i<=n;i++)
{
scanf("%d",&b);
if(!p[b])
a[i]=(2*a[i-1]+1)%modc;
else
a[i]=(2*a[i-1]-a[p[b]-1])%modc;
if(a[i]<0)
a[i]+=modc;
p[b]=i;
}
printf("%d\n",a[n]);
}
return 0;
}

这篇关于fzu—— Problem 2129 子序列个数的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1044306

相关文章

时序预测 | MATLAB实现LSTM时间序列未来多步预测-递归预测

时序预测 | MATLAB实现LSTM时间序列未来多步预测-递归预测 目录 时序预测 | MATLAB实现LSTM时间序列未来多步预测-递归预测基本介绍程序设计参考资料 基本介绍 MATLAB实现LSTM时间序列未来多步预测-递归预测。LSTM是一种含有LSTM区块(blocks)或其他的一种类神经网络,文献或其他资料中LSTM区块可能被描述成智能网络单元,因为

代码随想录——摆动序列(Leetcode376)

题目链接 贪心 class Solution {public int wiggleMaxLength(int[] nums) {if(nums.length <= 1){return nums.length;}// 当前一对差值int cur = 0;// 前一对差值int pre = 0;// 峰值个数int res = 1;for(int i = 0; i < nums.length -

想让Python序列切片更高效?这些技巧你不可不知!

目录 1、自定义类实现切片 🍏 1.1 实现__getitem__方法 1.2 支持正负索引与步长 2、利用 collections.abc 模块 🧠 2.1 继承MutableSequence类 2.2 重写关键方法 3、使用标准库itertools.slice 🍲 3.1 itertools工具介绍 3.2 slice函数应用实例 4、通过生成器实现动态切片 🌀

剑指Offer—编程题10(二进制中1 的个数)

代码如下,请在JDK7及以上版本运行: public class Test10 {/*** 请实现一个函数, 输入一个整数,输出该数二进制表示中1的个数。* 例如把9表示成二进制是1001 ,有2位是1. 因此如果输入9,该出2。** @param n 待的数字* @return 数字中二进制表表的1的数目*/public static int numberOfOne(int

最长考拉兹序列

题目:  考虑如下定义在正整数集上的迭代规则:  n    n/2 (若n为偶数) n    3n+1 (若n为奇数) 从13开始,可以迭代生成如下的序列:         13  40  20  10  5  16  8  4  2  1 可以看出这个序列(从13开始到1结束)共有10项。 尽管还未被证明,但普遍认为,从任何数开始最终都能抵达1并结束, 这被称为 “考拉兹序列”。

leetcode刷题(97)——106. 从中序与后序遍历序列构造二叉树

根据一棵树的中序遍历与后序遍历构造二叉树。 注意: 你可以假设树中没有重复的元素。 例如,给出 中序遍历 inorder = [9,3,15,20,7]后序遍历 postorder = [9,15,7,20,3] 返回如下的二叉树: 3/ \9 20/ \15 7 看下后序和中序遍历的框架: void traverse(TreeNode root) {trave

leetcode刷题(97)——105. 从前序与中序遍历序列构造二叉树

根据一棵树的前序遍历与中序遍历构造二叉树。 注意: 你可以假设树中没有重复的元素。 例如,给出 前序遍历 preorder = [3,9,20,15,7]中序遍历 inorder = [9,3,15,20,7] 返回如下的二叉树: 3/ \9 20/ \15 7 1.先回顾前序遍历和中序遍历的框架: void traverse(TreeNode root) {//

php字符串计算汉字、中英文数字个数

$str = '123abcDEF测试的事发地点';$length = strlen(preg_replace('/[\x00-\x7F]/', '', $str));$arr['en'] = strlen( $str) - $length; //(非中文)$arr['cn'] = intval($length / 3); // 编码GBK,除以2 (中文)print_r($

根据序列:2/1,3/2,5/3,...生成前30项打印出并求和

根据斐波那契数列 def fab(max): def fib_loop_while(max):max = maxa, b = 0, 1while max &

biostar handbook(五)|序列从何而来和质量控制

测序仪 2017年一篇发表在Nature的综述"DNA sequencing at 40: past, present and future"介绍了DNA测序这40年的发展历程。1976年,Sanger和Coulson同时发表了2种方法用于对上百个DNA碱基进行解码,这就是第一代测序技术。到了2005年,罗氏的454平台揭开了高通量测序的序幕,后面则是SOLiD,454和Illumina三方对抗