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);
    }

}