Cod sursa(job #3157575)

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

using namespace std;
ifstream fin("pascal.in");
ofstream fout("pascal.out");
/*void gcd(int a, int b, int &x, int &y){
    if(b == 0){
        x = 1;
        y = 0;
        return;
    }
    int x0,y0;
    gcd(b, a % b, x0, y0);
    x = y0;
    y = x0 - (a / b) * y0;
}
int invmod(int n, int m){
    int x,y;
    gcd(n,m,x,y);
    if(x % m == 0) return m;
    else return 1LL * (x % m + m) % m;
}*/
int nrd(int n, int d){
    int p = 0;
    while(n % d == 0){
        p++;
        n /= d;
    }
    return p;
}
int main()
{
    int n,d,k,s = 0,xk = 0,xn = 0,xnk = 0,p = 1;
    long long val = 1;
    fin >> n >> d;
    //nr din triunghiul lui pascal de pe linia n pozitia k = C(n - 1,k) = (n - 1)! / (k! * (n - 1 - k)!)
    // C(n,k + 1) = C(n,k) * (n - k) / (k + 1);
    while(p * d <= n){
        p *= d;
        xn += n / p;
    }
    xnk = xn - nrd(n,d);
    for(k = 1; k < (n + 1) / 2; k++){
        if(xn - (xk + xnk) > 0) s++;
        xk += nrd(k + 1,d);
        xnk -= nrd(n - k,d);
    }
    s *= 2;
    if(!(n & 1)){
        xk += nrd(k + 1,d);
        xnk -= nrd(n + k,d);
        if(xn - (xk + xnk) > 0) s++;
    }
    fout << s;
    return 0;
}