#include <iostream>
#include <cstdio>
#include "message.h"
#include "futbol.h"
using namespace std;
int n, k, p, nr, pocz, kon, dl;
long long N, K, P, L1, M1, liczba, inwersja, wynik, posredni;
long long licznik[11000005];
long long mianownik[11000005];
/*int GetN() {}
int GetK() {}
int GetP() {}
int MyNodeId() {}
void PutLL(int target, long long value) {}
void Send(int target) {}
int Receive(int source) {}
long long GetLL(int source) {}*/
long long get_inverse (long long A, long long P)
{
long long PP = P - 2;
long long potega = A;
long long res = 1;
while (PP)
{
if (PP % 2 == 1)
{
res *= potega;
res %= P;
}
PP /= 2;
potega *= potega;
potega %= P;
}
return res;
}
int main ()
{
n = GetN();
k = GetK();
p = GetP();
N = (long long)(n);
K = (long long)(k);
P = (long long)(p);
nr = MyNodeId();
pocz = (k / 100) * nr;
if (nr != 99) kon = (k / 100) * (nr + 1);
else kon = k + 1;
dl = kon - pocz;
if (dl > 0)
{
mianownik[dl - 1] = 1;
for (int i = dl - 2; i >= 0; --i) mianownik[i] = (mianownik[i + 1] * (long long)(pocz + i + 1)) % P;
liczba = mianownik[0];
if (pocz != 0)
{
liczba *= (long long)(pocz);
liczba %= P;
}
inwersja = get_inverse(liczba, P);
if (n != 0)
{
if (pocz == 0) licznik[0] = 1;
else licznik[0] = (long long)(n - pocz + 1);
for (int i = 1; i < dl; ++i) licznik[i] = (licznik[i - 1] * (long long)(n - pocz + 1 - i)) % P;
for (int i = 0; i < dl; ++i)
{
posredni += licznik[i] * mianownik[i];
posredni %= P;
}
}
}
L1 = M1 = 1;
if (nr != 0)
{
Receive(nr - 1);
N = GetLL(nr - 1);
L1 = GetLL(nr - 1);
M1 = GetLL(nr - 1);
wynik = GetLL(nr - 1);
}
if (dl == 0)
{
PutLL(nr + 1, N);
PutLL(nr + 1, L1);
PutLL(nr + 1, M1);
PutLL(nr + 1, wynik);
Send(nr + 1);
return 0;
}
if (n == 0)
{
n = (int)(N);
if (pocz == 0) licznik[0] = 1;
else licznik[0] = (long long)(n - pocz + 1);
for (int i = 1; i < dl; ++i) licznik[i] = (licznik[i - 1] * (long long)(n - pocz + 1 - i)) % P;
for (int i = 0; i < dl; ++i)
{
posredni += licznik[i] * mianownik[i];
posredni %= P;
}
}
posredni *= L1;
posredni %= P;
L1 *= licznik[dl - 1];
L1 %= P;
M1 *= inwersja;
M1 %= P;
posredni *= M1;
posredni %= P;
wynik += posredni;
wynik %= P;
if (nr != 99)
{
PutLL(nr + 1, N);
PutLL(nr + 1, L1);
PutLL(nr + 1, M1);
PutLL(nr + 1, wynik);
Send(nr + 1);
return 0;
}
printf("%lld\n", wynik);
return 0;
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 | #include <iostream> #include <cstdio> #include "message.h" #include "futbol.h" using namespace std; int n, k, p, nr, pocz, kon, dl; long long N, K, P, L1, M1, liczba, inwersja, wynik, posredni; long long licznik[11000005]; long long mianownik[11000005]; /*int GetN() {} int GetK() {} int GetP() {} int MyNodeId() {} void PutLL(int target, long long value) {} void Send(int target) {} int Receive(int source) {} long long GetLL(int source) {}*/ long long get_inverse (long long A, long long P) { long long PP = P - 2; long long potega = A; long long res = 1; while (PP) { if (PP % 2 == 1) { res *= potega; res %= P; } PP /= 2; potega *= potega; potega %= P; } return res; } int main () { n = GetN(); k = GetK(); p = GetP(); N = (long long)(n); K = (long long)(k); P = (long long)(p); nr = MyNodeId(); pocz = (k / 100) * nr; if (nr != 99) kon = (k / 100) * (nr + 1); else kon = k + 1; dl = kon - pocz; if (dl > 0) { mianownik[dl - 1] = 1; for (int i = dl - 2; i >= 0; --i) mianownik[i] = (mianownik[i + 1] * (long long)(pocz + i + 1)) % P; liczba = mianownik[0]; if (pocz != 0) { liczba *= (long long)(pocz); liczba %= P; } inwersja = get_inverse(liczba, P); if (n != 0) { if (pocz == 0) licznik[0] = 1; else licznik[0] = (long long)(n - pocz + 1); for (int i = 1; i < dl; ++i) licznik[i] = (licznik[i - 1] * (long long)(n - pocz + 1 - i)) % P; for (int i = 0; i < dl; ++i) { posredni += licznik[i] * mianownik[i]; posredni %= P; } } } L1 = M1 = 1; if (nr != 0) { Receive(nr - 1); N = GetLL(nr - 1); L1 = GetLL(nr - 1); M1 = GetLL(nr - 1); wynik = GetLL(nr - 1); } if (dl == 0) { PutLL(nr + 1, N); PutLL(nr + 1, L1); PutLL(nr + 1, M1); PutLL(nr + 1, wynik); Send(nr + 1); return 0; } if (n == 0) { n = (int)(N); if (pocz == 0) licznik[0] = 1; else licznik[0] = (long long)(n - pocz + 1); for (int i = 1; i < dl; ++i) licznik[i] = (licznik[i - 1] * (long long)(n - pocz + 1 - i)) % P; for (int i = 0; i < dl; ++i) { posredni += licznik[i] * mianownik[i]; posredni %= P; } } posredni *= L1; posredni %= P; L1 *= licznik[dl - 1]; L1 %= P; M1 *= inwersja; M1 %= P; posredni *= M1; posredni %= P; wynik += posredni; wynik %= P; if (nr != 99) { PutLL(nr + 1, N); PutLL(nr + 1, L1); PutLL(nr + 1, M1); PutLL(nr + 1, wynik); Send(nr + 1); return 0; } printf("%lld\n", wynik); return 0; } |
English