Cod sursa(job #2771972)

Utilizator SerbaP123Popescu Serban SerbaP123 Data 30 august 2021 10:07:06
Problema Pascal Scor 10
Compilator cpp-64 Status done
Runda PreOni 2005 Runda 2 Clasele 9-10 Marime 1.41 kb
#include <fstream>
#include <cmath>
#include <vector>
#include <algorithm>
#include <map>
#include <string>
#include <bitset>
#define pb(a) push_back(a)
using namespace std;

ifstream cin("pascal.in");
ofstream cout("pascal.out");

long long n, m;

int fact(long long n){
    long long p = 1;
    for(int i = 1; i <= n; ++i){
        p = (1LL * p * i) % m;
    }
    return p;
}


void euclid(long long a, long long b, long long &x, long long &y){
    if(b == 0){
        x = y = 1;
    }
    else{
        long long x1, y1;
        euclid(b, a % b, x1, y1);
        x = y1;
        y = x1 - a / b * y1;
    }
}

long long InversModular(long long a, long long b){
    long long x, y;
    euclid(a, b, x, y);
    while(x < 0){
        x += b;
    }
    return x;
}

long long casuta(long long i, long long j){
    return ((fact(i) % m) % m * (InversModular(fact(i - j) * fact(j), m) % m) % m) % m;
}

int main(){
    cin >> n >> m;
    long long ans = 0;
    if(n % 2 == 0){
        for(long long i = 1; i <= n / 2; ++i){
            if(casuta(n, i) == 0){
                ans += 2;
            }
            else if(i == n / 2 && !casuta(n, i)){
                ans--;
            }
        }
    }
    else{
        for(long long i = 1; i <= n / 2; ++i){
            if(!casuta(n, i)){
                ans += 2;
            }
        }
    }
    cout << ans;
    return 0;
}