#include <bits/stdc++.h> #include "teatr.h" #include "message.h" using namespace std; typedef long long ll; typedef long double ld; ll res, n, id, wyn; const int maxn = 1e8, lala = 2e7+2, N = 1e6 + 6; int l[lala]; ll zlicz[N]; //int GetN() { return int(1e8); } //int GetElement(int i) { return (i * 1ll * i) % int(1e6) + 1; } main(){ id = MyNodeId(); n = GetN(); int stala = 10; int przed = ceil(ld(n)/stala); ll poc = id/stala, kon = id%stala; int cale = n/przed; if(poc == kon && kon < cale){ for(int i=poc*przed; i<min((poc+1)*przed, n); i++){ l[i-poc*przed] = GetElement(i); } for(int j=0; j<20; j++){ memset(zlicz, 0, sizeof(zlicz)); for(int i=0; i<przed; i++){ if((l[i] & 1)) zlicz[l[i]]++; else res += zlicz[l[i]+1]; l[i] /= 2; } } PutLL(99, -res*(cale-2)); Send(99); } else{ if(poc < kon && kon < cale){ int licz = 0; for(int i=poc*przed; i<(poc+1)*przed; i++, licz++){ l[licz] = GetElement(i); } for(int i=kon*przed; i<min((kon+1)*przed, n); i++, licz++){ l[licz] = GetElement(i); } for(int j=0; j<20; j++){ memset(zlicz, 0, sizeof(zlicz)); for(int i=0; i<przed*2; i++){ if((l[i] & 1)) zlicz[l[i]]++; else res += zlicz[l[i]+1]; l[i] /= 2; } } } PutLL(99, res); Send(99); } if(id == 99){ for(int i=0; i<100; i++){ Receive(i); wyn += GetLL(i); } printf("%lld", wyn); } }
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 | #include <bits/stdc++.h> #include "teatr.h" #include "message.h" using namespace std; typedef long long ll; typedef long double ld; ll res, n, id, wyn; const int maxn = 1e8, lala = 2e7+2, N = 1e6 + 6; int l[lala]; ll zlicz[N]; //int GetN() { return int(1e8); } //int GetElement(int i) { return (i * 1ll * i) % int(1e6) + 1; } main(){ id = MyNodeId(); n = GetN(); int stala = 10; int przed = ceil(ld(n)/stala); ll poc = id/stala, kon = id%stala; int cale = n/przed; if(poc == kon && kon < cale){ for(int i=poc*przed; i<min((poc+1)*przed, n); i++){ l[i-poc*przed] = GetElement(i); } for(int j=0; j<20; j++){ memset(zlicz, 0, sizeof(zlicz)); for(int i=0; i<przed; i++){ if((l[i] & 1)) zlicz[l[i]]++; else res += zlicz[l[i]+1]; l[i] /= 2; } } PutLL(99, -res*(cale-2)); Send(99); } else{ if(poc < kon && kon < cale){ int licz = 0; for(int i=poc*przed; i<(poc+1)*przed; i++, licz++){ l[licz] = GetElement(i); } for(int i=kon*przed; i<min((kon+1)*przed, n); i++, licz++){ l[licz] = GetElement(i); } for(int j=0; j<20; j++){ memset(zlicz, 0, sizeof(zlicz)); for(int i=0; i<przed*2; i++){ if((l[i] & 1)) zlicz[l[i]]++; else res += zlicz[l[i]+1]; l[i] /= 2; } } } PutLL(99, res); Send(99); } if(id == 99){ for(int i=0; i<100; i++){ Receive(i); wyn += GetLL(i); } printf("%lld", wyn); } } |