题意:怎么使得一个长度为n的含有m个1的字符串s的f(s)最大,f(s)表示s中含有字符’1’的子串数目
#include<bits/stdc++.h>
using namespace std;typedef long long ll;
ll substr(ll x)
{
return x*(x+1)/2ll;
}
int main()
{
int tt;scanf("%d",&tt);
while(tt--)
{
ll n,m;scanf("%lld%lld",&n,&m);
ll gs0=(n-m)/(m+1);//把1作为隔板那么就存在m+1段,把(n-m)个0平均分配给这m+1段,一段中的0的个数
ll re=(n-m)%(m+1);//考虑上一个式子不一定整除,把余数考虑在往m+1中的re段考虑每段加1个
ll ans=substr(n);//全部的子串数目
ans-=(m+1-re)*substr(gs0);// 减去(对于0子串长度为gs0)不合法的数目
ans-=re*substr(gs0+1);//减去(对于0子串长度为gs0+1)不合法的数目
printf("%lld\n",ans);
}
}