Codeforces Round #619 (Div. 2) C. Ayoub's function(思维+容斥)

题目链接
Codeforces Round #619 (Div. 2) C. Ayoub's function(思维+容斥)_第1张图片
思路:我们可以反向思考,求至少包含1得区间是不是总数减去只含0得区间就行了,那么怎样才能让只含0得区间尽量得小呢?平均分配就可以了(n-m)/(m+1),注意一下(n-m)%(m+1)不为0的情况就行。

#include
using namespace std;
const int maxn=1e5+1;
typedef long long ll;
ll sum,k,l,n,m;
int main()
{
	int T;
	scanf("%d",&T);
	while(T--)
	{
		scanf("%lld%lld",&n,&m);
		k=(n-m)/(m+1);
		l=(n-m)%(m+1);
		sum=n*(n+1)/2;
		sum-=(k*(k+1)/2)*(m+1); 
		sum-=(k+1)*l;
		printf("%lld\n",sum);
	}
}

你可能感兴趣的:(容斥)