Ayoub's function

C - Ayoub's function

参考:Codeforces Round #619 (Div. 2) Editorial

当从正面计算感觉很困难的时候,不如从反面来想,这是利用了容斥的思想。

我们只需要用所有子串的个数减去只包含0的子串个数即可。

而要是只包含0的子串的数量最少,那么就要尽量地把0拆散一点。

所以最好的方案是把0均分。

// Created by CAD on 2020/2/13.
#include <bits/stdc++.h>
#define ll long long
using namespace std;
int main(){
    int t;
    cin>>t;
    while(t--){
        ll m,n;cin>>n>>m;
        ll z=(n-m),k=z/(m+1);
        ll ans=n*(n+1)/2;
        ans-=k*(k+1)/2*(m+1);
        ans-=(k+1)*(z%(m+1));
        cout<<ans<<'\n';
    }
}
posted @ 2020-02-14 14:39  caoanda  阅读(201)  评论(0编辑  收藏  举报