codeforces # 619 Div.2 (C - Función de Ayoub)

Release como una fórmula
para hacer un intervalo máximo que tiene 1, utiliza la inclusión y la exclusión
como se supone como un
número es n * (n-1) / 2
menos el número rango de 0 a
la cantidad total de la máxima para hacer la
necesaria 0 de manera que el número del intervalo mínimo
utiliza para dividir un total de m + 1 de la sección
idéntica como sea posible de modo que cada número de intervalo 0

código:

#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;
}

Publicado 36 artículos originales · ganado elogios 4 · Vistas 1399

Supongo que te gusta

Origin blog.csdn.net/qq_43781431/article/details/104313372
Recomendado
Clasificación