NC54749数列求和

链接:https://ac.nowcoder.com/acm/problem/54749
来源:牛客网

很经典的一道题,就是前缀和思想的应用:求数列在区间(i,r)内的和转换为前r项和减去前i-1项和。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll N=1e9+7;
const ll nl=500000004;
ll transfer(ll i){
     return ((i%N) * (( (i+1)%N ) * nl % N ) % N ) * ((2*i + 1)%N) % N;
}
int main(){
    int q;
    cin>>q;
    while(q--){
        ll l,r;
        cin>>l>>r;
        cout<<(transfer(r)-transfer(l-1)+r-l+1+N)%N<<endl;
    }
}
前缀和问题大多是大数据,这里有对除法运算取模的操作,转换成乘除数的逆元操作来保持精度。
对于这里的运算令b × x ≡ 1 (mod N)则此时 (a ÷ b) mod N 就等价于 (a × x) mod N。
全部评论

相关推荐

点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务