问题 K: 到底有多少个小和尚?

本文探讨了一道关于计算小和尚总数的数学题,通过暴力解法和公式解法求解,介绍了如何避免数据溢出和精度错误,以及在输出时的注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题 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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值