#include "message.h"
#include "futbol.h"
#include <stdio.h>
struct nwd_t{
long long int xa,xb,nwd;
};
void _nwd(long long int a,long long int b,long long int xaOld,long long int xaOlder,nwd_t *nwd){
if(b)
_nwd(b,a%b,xaOlder-a/b*xaOld,xaOld,nwd);
else{
nwd->xa=xaOlder;
nwd->nwd=a;
}
}
void NWD(long long int a,long long int b,nwd_t *nwd){
_nwd(a,b,0,1,nwd);
nwd->xb=(nwd->nwd-a*nwd->xa)/b;
}
long long int norm(long long int a,long long int p){
return ((a%p)+p)%p;
}
long long int rev(long long int a,long long int p){
nwd_t n;
NWD(a,p,&n);
return norm(n.xa,p);
}
int main() {
long long int n = GetN(), k = GetK(), p = GetP();
long long int last=1,sum=0;
long long int poczatek = (MyNodeId() * (k+1)) / NumberOfNodes();
long long int koniec = ((MyNodeId() + 1) * (k+1)) / NumberOfNodes();
for(int i=(poczatek>1?poczatek:1);i<koniec;i++){
long long int licznik=norm(n-i+1,p);
long long int mianownik=rev(i,p);
last=norm(norm(last*licznik,p)*mianownik,p);
sum=norm(sum+last,p);
}
int next=(MyNodeId()+1)%NumberOfNodes();
int prev=(MyNodeId()-1+NumberOfNodes())%NumberOfNodes();
if(MyNodeId() != 0){
Receive(prev);
long long int poprzedniaSuma=GetLL(prev);
long long int poprzedniElement=GetLL(prev);
last=norm(last*poprzedniElement,p);
sum=norm(sum*poprzedniElement+poprzedniaSuma,p);
}
PutLL(next,sum);
PutLL(next,last);
Send(next);
if(MyNodeId() == 0){
Receive(prev);
long long int poprzedniaSuma=GetLL(prev);
printf("%lld\n",norm(poprzedniaSuma+1,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 | #include "message.h" #include "futbol.h" #include <stdio.h> struct nwd_t{ long long int xa,xb,nwd; }; void _nwd(long long int a,long long int b,long long int xaOld,long long int xaOlder,nwd_t *nwd){ if(b) _nwd(b,a%b,xaOlder-a/b*xaOld,xaOld,nwd); else{ nwd->xa=xaOlder; nwd->nwd=a; } } void NWD(long long int a,long long int b,nwd_t *nwd){ _nwd(a,b,0,1,nwd); nwd->xb=(nwd->nwd-a*nwd->xa)/b; } long long int norm(long long int a,long long int p){ return ((a%p)+p)%p; } long long int rev(long long int a,long long int p){ nwd_t n; NWD(a,p,&n); return norm(n.xa,p); } int main() { long long int n = GetN(), k = GetK(), p = GetP(); long long int last=1,sum=0; long long int poczatek = (MyNodeId() * (k+1)) / NumberOfNodes(); long long int koniec = ((MyNodeId() + 1) * (k+1)) / NumberOfNodes(); for(int i=(poczatek>1?poczatek:1);i<koniec;i++){ long long int licznik=norm(n-i+1,p); long long int mianownik=rev(i,p); last=norm(norm(last*licznik,p)*mianownik,p); sum=norm(sum+last,p); } int next=(MyNodeId()+1)%NumberOfNodes(); int prev=(MyNodeId()-1+NumberOfNodes())%NumberOfNodes(); if(MyNodeId() != 0){ Receive(prev); long long int poprzedniaSuma=GetLL(prev); long long int poprzedniElement=GetLL(prev); last=norm(last*poprzedniElement,p); sum=norm(sum*poprzedniElement+poprzedniaSuma,p); } PutLL(next,sum); PutLL(next,last); Send(next); if(MyNodeId() == 0){ Receive(prev); long long int poprzedniaSuma=GetLL(prev); printf("%lld\n",norm(poprzedniaSuma+1,p)); } } |
English