Cod sursa(job #3157579)

Utilizator Radu_MocanasuMocanasu Radu Radu_Mocanasu Data 15 octombrie 2023 22:53:39
Problema Pascal Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.57 kb
#include <bits/stdc++.h>

using namespace std;
ifstream fin("pascal.in");
ofstream fout("pascal.out");
struct factori{
    int f2,f3,f5;
};
void init(factori &x){
    x.f2 = x.f3 = x.f5 = 0;
}
void update(int n, factori &x, int semn){
    while(n % 2 == 0){
        x.f2 = x.f2 + semn;
        n /= 2;
    }
    while(n % 3 == 0){
        x.f3 = x.f3 + semn;
        n /= 3;
    }
    while(n % 5 == 0){
        x.f5 = x.f5 + semn;
        n /= 5;
    }
}
bool verif(factori xn, factori xk, factori xnk, int d){
    if(d == 2) return (xn.f2 - (xk.f2 + xnk.f2)) > 0;
    if(d == 3) return (xn.f3 - (xk.f3 + xnk.f3)) > 0;
    if(d == 4) return (xn.f2 - (xk.f2 + xnk.f2)) > 1;
    if(d == 5) return (xn.f5 - (xk.f5 + xnk.f5)) > 0;
    if(d == 6) return (xn.f2 - (xk.f2 + xnk.f2)) > 0 && (xn.f3 - (xk.f3 + xnk.f3)) > 0;
}
int main()
{
    int n,d,k,s = 0,p = 1;
    factori xn,xk,xnk;
    init(xnk);
    init(xn);
    init(xk);
    long long val = 1;
    fin >> n >> d;
    while(p * 2 <= n){
        p *= 2;
        xn.f2 += n / p;
        xnk.f2 += n / p;
    }
    p = 1;
    while(p * 3 <= n){
        p *= 3;
        xn.f3 += n / p;
        xnk.f3 += n / p;
    }
    p = 1;
    while(p * 5 <= n){
        p *= 5;
        xn.f5 += n / p;
        xnk.f5 += n / p;
    }
    update(n,xnk,-1);
    for(k = 1; k < (n + 1) / 2; k++){
        if(verif(xn,xk,xnk,d)) s++;
        update(k + 1,xk,1);
        update(n - k,xnk,-1);
    }
    s *= 2;
    if(!(n & 1)){
        if(verif(xn,xk,xnk,d)) s++;
    }
    fout << s;
    return 0;
}