補題記錄——Codeforces Round #619 (Div. 2) C. Ayoub's function

在這裏插入圖片描述
在這裏插入圖片描述
此題求最大的至少含一個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();
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章