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';
}
}
CAD加油!欢迎跟我一起讨论学习算法,QQ:1401650042