此題求最大的至少含一個1的子序列數目,那麼可以這麼想,求出最小的只含0的子序列數目,用總的子序列數目減去即可。代碼附上,當時沒怎麼想出來。
至於怎麼分,可以這麼思考,先均分0的數目,再求餘數,再給每一段平均分1。
舉個例子:m=7,n=2,那麼0就是5個,可以分成三段,先5/3=1;那麼三段每一段都有一個,餘數爲2,那麼就有兩端要加上1;
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
void solve()
{
long long ans, n, m; //分成m+1段
cin >> n >> m;
ans = n * (n + 1) / 2;
long long w = n - m;//0的數量
long long a = w / (m+1), b = w % (m+1);
ans = ans - (1 + a) * a / 2 * (m + 1 - b) - b * (1 + a + 1) * (a + 1) / 2;
cout << ans<<endl;
}
int main()
{
int t;
cin >> t;
while (t--)
solve();
}