codeforces #619 div.2 (C - Ayoub's function)

推出一个式子就好了
要使具有1的区间最多,用到容斥
想假设都为1
个数是n*(n-1)/2
再减去0的区间个数
要使总数最大
就要使0的区间个数最小
用1来划分,共m+1的区间
尽可能让每个区间0的个数相同

代码:

#include <bits/stdc++.h>
#define ll long long
using namespace std;
int main()
{
    ll t,n,m;
    cin>>t;
    while(t--)
    {
        cin>>n>>m;
        if(m==0)
        {cout<<"0"<<endl;
        continue;}
        if(n==1)
        {cout<<"1"<<endl;
        continue;}
        ll ans=n*(n-1)/2;
        ans+=m;
        ////////////////////////////////////////////
        ll c0=n-m;//c0为0的个数
        ll op=m+1;//op为由1划分的区块数
        if(c0%op==0)
        {
            ll kk=c0/op;
            ans-=op*kk*(kk-1)/2;
            cout<<ans<<endl;
        }
        else
        {
            ll kk=c0/op;
            ll mod=c0%op;
            ll aa=mod*(kk+1)*(kk)/2;
            ll bb=(op-mod)*kk*(kk-1)/2;
            ans-=(aa+bb);
            cout<<ans<<endl;
        }
    }
    return 0;
}

发布了36 篇原创文章 · 获赞 4 · 访问量 1399

猜你喜欢

转载自blog.csdn.net/qq_43781431/article/details/104313372
今日推荐