HDU1436: Neo 的区段求和

本文介绍了一个关于数列求和的问题——Neo的区段求和,并提供了一种有效的算法实现。该问题涉及数列的递推定义及如何通过预处理技术快速计算特定区间的元素总和。

1436: Neo 的区段求和

时间限制: 1 Sec  内存限制: 128 MB

提交: 13  解决: 4  统计

题目描述

定义:

F0=0F0=0

F1=1F1=1

F2=2F2=2

Fi=Fi1+Fi3,i>2Fi=Fi−1+Fi−3,i>2

S(l,r)=i=lirFiS(l,r)=∑i=li≤rFi

现在给定 l,rl,r,由于 s(l,r)s(l,r) 过大,你只要输出 s(l,r)%1000000007s(l,r)%1000000007 的值即可。

输入

多组输入数据,每组两个整数 l,rl,r。(0lr1060≤l≤r≤106

输出

每组输出一个整数 s(l,r)%1000000007s(l,r)%1000000007 占一行。

样例输入

0 1
0 2

样例输出

1
3

提示

注:

由同余定理可得如下结论:

(ab)%m=((a%m)(b%m))%m(a∗b)%m=((a%m)∗(b%m))%m

(a+b)%m=((a%m)+(b%m))%m(a+b)%m=((a%m)+(b%m))%m

来源

LZ
提交 讨论

中文  English  标准版  精简版
Anything about HPU OnlineJudge, Please Contact Admin:BoilTask 
All Copyright Reserved 2010-2017 HPUACM
Based On GPL2.0 HUSTOJ Project Modified by BoilTask 

#include<cstdio>
#include<cstring>
#include<algorithm> 
using namespace std;
typedef long long ll;
const int mod=1000000007;
int f[(int)1e6+5];
int sum[(int)1e6+5];
void init() 	//打个表就好了 
{
	f[0]=0;
	f[1]=1;
	f[2]=2;
	sum[0]=0;
	sum[1]=sum[0]+f[1];
	sum[2]=sum[1]+f[2];
	for(int i=3;i<=1000000;i++)
	{
		f[i]=f[i-1]%mod+f[i-3]%mod;
		sum[i]=sum[i-1]%mod+f[i]%mod;
		sum[i]%=mod;					//记得要让它也取下模 
	}
	
}
int main()
{
	init();
	int l,r;
	while(scanf("%d %d",&l,&r)!=EOF)
		printf("%d\n",(sum[r]-sum[l-1]+mod)%mod);//还是细节啊, sum[r]-sum[l-1]可能小于零,因此WA了一次 
	return 0;
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值