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
#include "teatr.h"
#include "message.h"
#include <bits/stdc++.h>
#define f first
#define s second
#define LL long long
#define ALL(V) V.begin(),V.end()
#define boost ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0)
#define endl "\n"
#define debug(x) cerr<<#x<<": "<<x<<endl
using namespace std;
const LL N=1e6+69, base=1024*1024,mod=1e9+7;
int tree[base*2+69];
// int GetN() { return int(1e8); }
// int GetElement(int i) { return (i * 1ll * i) % int(1e6) + 1; }
void insert(int v) {
    v+=base;
    while(v>1) {
        tree[v]++;
        v/=2;
    }
}
int query(int v) {
    v+=base;
    int re=tree[v];
    while(v>1) {
        if(v%2==0) re+=tree[v+1];
        v/=2;
    }
    return re;
}
long long countInversions(vector <pair<int,int>> vek) {
    long long re=0;
    sort(ALL(vek));
    if(vek.size()==1) {
        pair<int,int> u=vek[0];
        for(int i=u.f;i<=u.s;i++) {
            int a = GetElement(i);
            re+=query(a+1);
            insert(a);
        }
    }
    else if(vek.size()==2) {
        pair<int,int> u=vek[0];
        for(int i=u.f;i<=u.s;i++) {
            int a = GetElement(i);
            insert(a);
        }
        u=vek[1];
        for(int i=u.f;i<=u.s;i++) {
            int a = GetElement(i);
            re+=query(a+1);
        }
    }
    return re;
}
pair<int,int> getInter(long long nr) {
    long long a=nr*GetN();
    a/=10;
    long long b=(nr+1)*GetN();
    b=b/10-1;
    return {a,b};
}
vector<pair<int,int>> getIntevals(int nr) {
    vector <pair<int,int>> re;
    int zm1=nr%10;
    re.push_back(getInter(nr%10));
    nr/=10;
    int zm2=nr%10;
    if(zm1<zm2) {
        re.clear();
        return re;
    }
    re.push_back(getInter(nr%10));
    if(re[0]==re[1]) re.pop_back();
    return re;
}
int32_t main(void) {
    if(GetN()<1000) {
        if(MyNodeId()!=0) return 0;
        vector <pair<int,int>> V;
        V.push_back({0,GetN()-1});
        cout<<countInversions(V)<<endl;
        return 0;
    }
    if(MyNodeId()==0) {
        long long wynik=countInversions(getIntevals(MyNodeId()));
        for(int i=1;i<=99;i++) {
            Receive(i);
            long long re=GetLL(i);
            wynik+=re;
        }
        cout<<wynik<<endl;
    }
    else {
        long long re=countInversions(getIntevals(MyNodeId()));
        PutLL(0, re);
        Send(0);
    }
}