问题 K: 到底有多少个小和尚?
题目描述
有一天LiMn2O4给skyer_hxx讲了一个小故事。从前有座山,山上有N个庙,每个庙里有1个老和尚和N+1个小和尚。山中流传着一个故事:从前有座山,山上有N+1个庙,每个庙里有1个老和尚和N+2个小和尚。山中流传着一个故事:从前有座…从前有座山,山上有M个庙,每个庙里有1个老和尚和M+1个小和尚。skyer_hxx听完这个故事后想知道一共有多少个小和尚?
输入
第一行有一个正整数K。
接下来有K行,每行有两个数N,M。
数据保证1≤K≤100 000,0≤N,M<1 000 000。
输出
输出K行,表示结果
样例输入
2
1 3
2 4
样例输出
20
38
注意:
1.暴力解法的for循环中的i要定义为long long 型的,否则i*(i+1)会溢出,造成sum的计算结果不对
2.sum不能定义为double的类型,否则会出现精度的错误,致wa
3.cout不可以用endl结束输出,会时间超限,要用’\n’换行
long long sum[1000005];
int main()
{
int k;cin>>k;
sum[1]=2;
for(long long i=2;i<=1000000;i++) sum[i]=sum[i-1]+i*(i+1);///暴力解法
while(k--)
{
long long n,m;
scanf("%lld%lld",&n,&m);
n--;
//printf("%lld\n",m*(m+1)*(m+2)/3-n*(n+1)*(n+2)/3);///公式解法
cout<<sum[m]-sum[n]<<'\n';
}
return 0;
}