#include "message.h" #include "futbol.h" #include "bits/stdc++.h" typedef long long ll; struct Res{ ll d,x,y; }; //Wprowadzenie do algorytmów - Cormen, ... Res extended_euclid(ll a, ll b){ if(b == 0) return {a,1,0}; else{ Res pom = extended_euclid(b, a%b); return {pom.d, pom.y, pom.x-(a/b)*pom.y}; } } ll odwr(ll a, ll q){ Res pom = extended_euclid(a,q); while(pom.x<0){ pom.x += q; } return pom.x; } int main(){ ll n = GetN(), k = GetK(), p = GetP(); int Nd=NumberOfNodes(),Id=MyNodeId(); ll prod,sum = 0,silnia = 1; if(n==0){ PutLL(0,0); Send(0); return 0; } ll bound = n*(Id+1)/Nd; for(int i=n*Id/Nd+1; i <= bound; i++){ silnia *= i; silnia %= p; } bound = (k+1)*(Id+1)/Nd; for(int i=(k+1)*Id/Nd; i < bound; i++){ prod=1; for(int j=i+1;j<=n;j++){ prod *= j; prod %= p; } for(int j=n-i+1;j<=n;j++){ prod *= j; prod %= p; } sum += prod; sum %= p; } if(Id > 0){ PutLL(0, silnia); PutLL(0, sum); Send(0); }else{ bool par = true; for(int i=1;i<Nd;i++){ Receive(i); prod = GetLL(i); //fprintf(stderr, "Rec (%d) %lld",i,prod); if(prod == 0 || !par){ par = false; continue; } silnia *= prod; silnia %= p; sum += GetLL(i); sum %= p; //fprintf(stderr, " suma %lld silnia %lld\n",sum,silnia); } if(!par){ for(int i=(k+1)/Nd;i<=k;i++){ prod=1; for(int j=i+1;j<=n;j++){ prod *= j; prod %= p; } for(int j=n-i+1;j<=n;j++){ prod *= j; prod %= p; } sum += prod; sum %= p; } for(int i=n/Nd+1;i<=n;i++){ silnia *= i; silnia %= p; } } silnia = odwr(silnia, p); printf("%lld", (silnia*sum)%p); } }
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 | #include "message.h" #include "futbol.h" #include "bits/stdc++.h" typedef long long ll; struct Res{ ll d,x,y; }; //Wprowadzenie do algorytmów - Cormen, ... Res extended_euclid(ll a, ll b){ if(b == 0) return {a,1,0}; else{ Res pom = extended_euclid(b, a%b); return {pom.d, pom.y, pom.x-(a/b)*pom.y}; } } ll odwr(ll a, ll q){ Res pom = extended_euclid(a,q); while(pom.x<0){ pom.x += q; } return pom.x; } int main(){ ll n = GetN(), k = GetK(), p = GetP(); int Nd=NumberOfNodes(),Id=MyNodeId(); ll prod,sum = 0,silnia = 1; if(n==0){ PutLL(0,0); Send(0); return 0; } ll bound = n*(Id+1)/Nd; for(int i=n*Id/Nd+1; i <= bound; i++){ silnia *= i; silnia %= p; } bound = (k+1)*(Id+1)/Nd; for(int i=(k+1)*Id/Nd; i < bound; i++){ prod=1; for(int j=i+1;j<=n;j++){ prod *= j; prod %= p; } for(int j=n-i+1;j<=n;j++){ prod *= j; prod %= p; } sum += prod; sum %= p; } if(Id > 0){ PutLL(0, silnia); PutLL(0, sum); Send(0); }else{ bool par = true; for(int i=1;i<Nd;i++){ Receive(i); prod = GetLL(i); //fprintf(stderr, "Rec (%d) %lld",i,prod); if(prod == 0 || !par){ par = false; continue; } silnia *= prod; silnia %= p; sum += GetLL(i); sum %= p; //fprintf(stderr, " suma %lld silnia %lld\n",sum,silnia); } if(!par){ for(int i=(k+1)/Nd;i<=k;i++){ prod=1; for(int j=i+1;j<=n;j++){ prod *= j; prod %= p; } for(int j=n-i+1;j<=n;j++){ prod *= j; prod %= p; } sum += prod; sum %= p; } for(int i=n/Nd+1;i<=n;i++){ silnia *= i; silnia %= p; } } silnia = odwr(silnia, p); printf("%lld", (silnia*sum)%p); } } |