Cod sursa(job #2765362)

Utilizator DordeDorde Matei Dorde Data 26 iulie 2021 16:54:01
Problema Pascal Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.56 kb
#include <iostream>
#include <bitset>
#include <cstdio>
using namespace std;
int const N = 5e6 + 3;
int v [N] , r , d , ans;
char log [N];
bool viz [N];
void getLog (int x){
    for(int i = 2 ; i <= r ; ++ i)
        if (i % x == 0)
            log [i] = 1 + log [i / x] , v [i] = v [i - 1] + log [i];
        else
            v [i] = v [i - 1];
    return;
}
int main()
{
    freopen ("pascal.in" , "r" , stdin);
    freopen ("pascal.out" , "w" , stdout);
    scanf ("%d%d" , &r , &d);
    if (d == 2 || d == 3 || d == 5){
        getLog (d);
        for(int i = 1 ; i <= r ; ++ i)
            if (v [r] > v [r - i] + v [i])
                ++ ans;
        printf ("%d" , ans);
        return 0;
    }
    if (d == 4){
        getLog (2);
        for(int i = 1 ; i <= r ; ++ i)
            if (v [r] > v [r - i] + v [i] + 1)
                ++ ans;
        printf ("%d" , ans);
        return 0;
    }
    for(int i = 2 ; i <= r ; ++ i)
        if (i % 2)
            v [i] = v [i - 1];
        else
            log [i] = 1 + log [i >> 1] , v [i] = v [i - 1] + log [i];
    for(int i = 0 ; i <= r ; ++ i){
        if (v [r] > v [r - i] + v [i])
            viz [i] = true;
        log [i] = 0;
    }
    v [2] = 0;
    for(int i = 3 ; i <= r ; ++ i)
        if (i % 3)
            v [i] = v [i - 1] , log [i] = 0;
        else
            log [i] = 1 + log [i / 3] , v [i] = v [i - 1] + log [i];
    for(int i = 0 ; i <= r ; ++ i)
        if (viz [i] && v [r] > v [r - i] + v [i])
            ++ ans;
    printf ("%d" , ans);
    return 0;
}