链接:https://ac.nowcoder.com/acm/contest/949/B
来源:牛客网
题目描述
小雨手上有一个填满了数字的三角形。这个三角形一共有 nn 层,其中第 ii 层共有 ii个数,且第 11 个数和第 ii 个数均为 ii 。其余的数中,第 jj 个数是上一层中第 j−1j−1 个数和第 jj 个数的和。小雨想知道这个三角形第 xx 层到第 yy 层所有数的和,一共有 mm 个询问。
输入描述:
第一行两个正整数 n,mn,m,表示这个三角形的层数和询问个数。 接下来 mm 行,每行两个正整数 x,yx,y,表示一次询问。
输出描述:
输出共 mm 行,每行一个整数,表示一组询问的答案,对 109+7109+7 取模。
示例1
输入
复制
5 3 1 2 1 5 3 5
输出
复制
5 83 78
说明
画出这个三角形: 1 2 2 3 4 3 4 7 7 4 5 11 14 11 5 第 1∼21∼2 层的和为 1+2+2=51+2+2=5 。 第 1∼51∼5 层的和为 1+2+2+3+4+3+4+7+7+4+5+11+14+11+5=831+2+2+3+4+3+4+7+7+4+5+11+14+11+5=83 。 第 3∼53∼5 层的和为 3+4+3+4+7+7+4+5+11+14+11+5=783+4+3+4+7+7+4+5+11+14+11+5=78 。
备注:
1≤n≤103,1≤m≤103,1≤x≤y≤n
思路:
数据范围不大,直接先处理每一行就可以,注意取模
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<queue>
#include<stack>
#include<set>
#include<map>
#include<vector>
#include<cmath>
const int maxn=1e5+5;
typedef long long ll;
using namespace std;
int n,m,l,r;
long long a[1005];
const long long mod = 1e9+7;
void init(){
a[0]=0;
a[1]=1;
a[2]=4;
a[3]=10;
for(int i=4;i<=1005;i++){
a[i]=(2*a[i-1]+2)%mod;
}
}
int main(){
init();
scanf("%d%d",&n,&m);
while(m--){
long long sum=0;
scanf("%d%d",&l,&r);
for(int i=l;i<=r;i++){
sum+=a[i];
sum%=mod;
}
printf("%lld\n",sum);
}
return 0;
}