#include "futbol.h" #include "message.h" #include <iostream> using namespace std; long long power(long long a, long long b, long long mod) { long long x = 1, y = a; while (b > 0) { if (b % 2) { x = (x*y) % mod; } y = (y*y) % mod; b /= 2; } return x % mod; } long long modular_inverse(long long n, long long mod) { return power(n, mod - 2, mod); } int main() { long long n = GetN(); long long k = GetK(); long long p = GetP(); int nodes = NumberOfNodes(); int instance = MyNodeId(); long long wynik = 0; long long zliczacz = 1; int amount = k / nodes; int begin = instance * amount; int end = instance * amount + amount; if (instance == nodes - 1) { end += k % nodes; } //cout << instance << " " << begin << " " << end << endl; for (long long i = begin; i < end; i++) { zliczacz = (zliczacz % p) * ((n - i) % p); zliczacz = (zliczacz % p) * (modular_inverse(i + 1, p)%p); wynik += zliczacz; wynik = wynik % p; //cout << wynik << " " << zliczacz << " "<< modular_inverse(i + 1, p) << endl; } if (instance < nodes - 1) { Receive(instance + 1); long long wynikNastepny = GetLL(instance + 1); wynik += (zliczacz %p) * wynikNastepny; wynik = wynik % p; } if (instance == 0) { wynik++; wynik = wynik % p; cout << wynik << endl; } else { PutLL(instance-1, wynik); Send(instance - 1); } 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 | #include "futbol.h" #include "message.h" #include <iostream> using namespace std; long long power(long long a, long long b, long long mod) { long long x = 1, y = a; while (b > 0) { if (b % 2) { x = (x*y) % mod; } y = (y*y) % mod; b /= 2; } return x % mod; } long long modular_inverse(long long n, long long mod) { return power(n, mod - 2, mod); } int main() { long long n = GetN(); long long k = GetK(); long long p = GetP(); int nodes = NumberOfNodes(); int instance = MyNodeId(); long long wynik = 0; long long zliczacz = 1; int amount = k / nodes; int begin = instance * amount; int end = instance * amount + amount; if (instance == nodes - 1) { end += k % nodes; } //cout << instance << " " << begin << " " << end << endl; for (long long i = begin; i < end; i++) { zliczacz = (zliczacz % p) * ((n - i) % p); zliczacz = (zliczacz % p) * (modular_inverse(i + 1, p)%p); wynik += zliczacz; wynik = wynik % p; //cout << wynik << " " << zliczacz << " "<< modular_inverse(i + 1, p) << endl; } if (instance < nodes - 1) { Receive(instance + 1); long long wynikNastepny = GetLL(instance + 1); wynik += (zliczacz %p) * wynikNastepny; wynik = wynik % p; } if (instance == 0) { wynik++; wynik = wynik % p; cout << wynik << endl; } else { PutLL(instance-1, wynik); Send(instance - 1); } return 0; } |