博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
TYVJ P1091 等差数列 Label:dp
阅读量:6868 次
发布时间:2019-06-26

本文共 1300 字,大约阅读时间需要 4 分钟。

背景

广东汕头聿怀初中 Train#3 Problem 3

描述

等差数列的定义是一个数列S,它满足了(S[i]-S[i-1]) = d (i>1)。显然的一个单独的数字或者两个数字也可以形成一个等差数列。
经过一定的学习小C发现这个问题太简单了,等差数列的和不就是(Sn+S1)*n/2?因为这个问题实在是太简单了,小C不屑于去解决它。这让小C的老师愤怒了,他就找了另外一个问题来问他。
小C的老师给了他一个长度为N的数字序列,每个位置有一个整数,他需要小C帮他找到这个数字序列里面有多少个等差数列。
……
这个问题似乎太难了,小C需要你的程序帮他来解决这个问题。

输入格式

第一行一个整数N,表示老师给出的数字序列的长度。
第二行有N个整数A[i],表示数字序列每个数字的大小。

输出格式

输出只有一行一个整数,表示这个序列中的等差数列的个数(mod 9901)。

测试样例1

输入

1 4 2 3 7 

输出

17

备注

对于30%的数据,N <= 100
对于70%的数据,N <= 500
对于100%的数据,N <= 1000;-500 <= A[i] <= 500

代码

#include
#include
#include
#include
#include
#define block 1010using namespace std;int cnt,N,f[1010][2020],a[1010];int main(){// freopen("01.txt","r",stdin); scanf("%d",&N); for(int i=1;i<=N;i++) scanf("%d",&a[i]); for(int i=1;i<=N;i++){ cnt=(cnt+i)%9901; for(int j=i-1;j>=1;j--){ int x=a[i]-a[j]; cnt=(cnt+f[j][x+block])%9901; f[i][x+block]=(f[i][x+block]+f[j][x+block]+1)%9901; } } printf("%d\n",cnt); return 0;}

几个点:

题目要求mod 9901

block 是因为有负数,所以向右平移1010个单位来记入到f数组

下面第一句话不能改成2,想想看为什么

1,cnt=(cnt+f[j][x+block])%9901;
2,cnt=(cnt+f[i][x+block])%9901;

转载于:https://www.cnblogs.com/radiumlrb/p/5792618.html

你可能感兴趣的文章
CactiFans V1.0中文版发布
查看>>
HTML如何显示小于号“<”等特殊符号?
查看>>
别伤了虚拟桌面管理员的"心"
查看>>
Windows系统使用IntelliJ IDEA 搭建Hadoop的开发调试环境(一)
查看>>
yum安装lamp
查看>>
Web.Config文件中数据库连接配置
查看>>
[Unity 3D] Unity 3D 性能优化 (一)
查看>>
spring Quartz定时任务调度 时间设置
查看>>
SymmetricDS: 数据库数据同步Database synchronization
查看>>
Disabling OOM killer on Ubuntu 14.04
查看>>
VBS备份脚本
查看>>
CentOS 6.5 自动安装镜像
查看>>
Storm与Spark Streaming比较
查看>>
我的友情链接
查看>>
Exchange Server 运维管理01:Exchange中Active Directory 有什么用?
查看>>
dhcp服务在企业中的应用
查看>>
linux系统管理之四:服务状态
查看>>
VMware View FAQ[一]
查看>>
【原创翻译】布尔值(boolean)
查看>>
三元运算式、lambda表达式、内置函数map、reduce、filter以及yield生成器
查看>>