补题记录——Codeforces Round #619 (Div. 2) C. Ayoub's function

补题记录——Codeforces Round #619 (Div. 2) C. Ayoub's function_第1张图片
补题记录——Codeforces Round #619 (Div. 2) C. Ayoub's function_第2张图片
此题求最大的至少含一个1的子序列数目,那么可以这么想,求出最小的只含0的子序列数目,用总的子序列数目减去即可。代码附上,当时没怎么想出来。
至于怎么分,可以这么思考,先均分0的数目,再求余数,再给每一段平均分1。
举个例子:m=7,n=2,那么0就是5个,可以分成三段,先5/3=1;那么三段每一段都有一个,余数为2,那么就有两端要加上1;

#include
#include
#include
#include
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();
}

你可能感兴趣的:(补题记录)