推出一个式子就好了
要使具有1的区间最多,用到容斥
想假设都为1
个数是n*(n-1)/2
再减去0的区间个数
要使总数最大
就要使0的区间个数最小
用1来划分,共m+1的区间
尽可能让每个区间0的个数相同
代码:
#include <bits/stdc++.h>
#define ll long long
using namespace std;
int main()
{
ll t,n,m;
cin>>t;
while(t--)
{
cin>>n>>m;
if(m==0)
{cout<<"0"<<endl;
continue;}
if(n==1)
{cout<<"1"<<endl;
continue;}
ll ans=n*(n-1)/2;
ans+=m;
////////////////////////////////////////////
ll c0=n-m;//c0为0的个数
ll op=m+1;//op为由1划分的区块数
if(c0%op==0)
{
ll kk=c0/op;
ans-=op*kk*(kk-1)/2;
cout<<ans<<endl;
}
else
{
ll kk=c0/op;
ll mod=c0%op;
ll aa=mod*(kk+1)*(kk)/2;
ll bb=(op-mod)*kk*(kk-1)/2;
ans-=(aa+bb);
cout<<ans<<endl;
}
}
return 0;
}