Capacitated Facility Location Problem

题目

Suppose there are n facilities and m customers. We wish
to choose:
(1) which of the n facilities to open
(2) the assignment of customers to facilities
The objective is to minimize the sum of the opening cost
and the assignment cost.
The total demand assigned to a facility must not exceed
its capacity
在这里插入图片描述

解题过程

这道题我用了两种方法来解决——贪心算法和模拟退火法,不过效果都不大好(没办法水平就这样^ - ^),感觉和最优解相差甚远

贪心算法

贪心算法的思路很简单,就是让每个用户选择服务费用最少的工厂,最后计算出总的结果,不多说,上代码吧

#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <algorithm>
#include <time.h>

using namespace std;

struct factory
{
    int open_cost; // 工厂开启的费用
    int rest; // 工厂剩余的容量
    int state = 0;
    int server_num = 0;
};



void tanxin(string file_name, int m, ofstream& out1, ofstream& out2) {
    vector<int> capacity_need;
    vector<vector<int> > server_cost;

    vector<factory> factories;

    int factory_num;
    int user_num;
    ifstream in;
    string dir = "../Instances/";
    in.open(( dir + file_name).c_str());
    in >> factory_num >> user_num;
    for (int i = 0; i < factory_num; ++i) {
        factory f;
        in >> f.rest;
        in >> f.open_cost;
        factories.push_back(f);
        //cout << f.rest << " " << f.open_cost <<endl;
    }
    int temp;
    char c;
    for (int i = 0; i < user_num; ++i) {
        in >> temp >> c;
        capacity_need.push_back(temp);
    }
    for (int i = 0; i < user_num; ++i) {
        vector<int> v;
        for (int j = 0; j < factory_num; ++j) {
            if (m >= 56) in >> temp;
            else in >> temp >> c;
            v.push_back(temp);
            //cout << v[j] << " ";
        }
        server_cost.push_back(v);
        //cout << endl;
    }
    int total_cost = 0;
    vector<int> server_factories;
    double start = clock();
    for (int i = 0; i < user_num; ++i) {
        int cost = INT_MAX;
        int k = -1;
        for (int j = 0; j < factory_num; ++j) {
            if(factories[j].rest >= capacity_need[i]) {   
                if ( cost >  server_cost[i][j] ) {
                    cost = server_cost[i][j];
                    k = j;
                }
            }
        }
        total_cost += cost;
        server_factories.push_back(k); 
        factories[k].rest -= capacity_need[i];
        factories[k].server_num += 1;
    }
    for (int i = 0; i < factory_num; ++i) {
        if (factories[i].server_num > 0) {
            factories[i].state = 1;
            total_cost += factories[i].open_cost;
        }
    }
    double end = clock();
    double times = (double)(end-start)/CLK_TCK;
    out1 << "|" << file_name << "|" << total_cost << "|" << times << "|" << endl;
    out2 << total_cost << endl;
    for (int i = 0; i < factory_num; ++i) {
        out2 << factories[i].state << " ";
    }
    out2 << endl;
    for (int i = 0; i < user_num; ++i) {
        out2 << server_factories[i]  << " ";
    }
    out2 << endl << endl;
}

int main() {
    char c[3];
    ofstream out1;
    out1.open("./1.txt");
    ofstream out2;
    out2.open("./2.txt");
    for (int i = 1; i <= 71; ++i) {
        sprintf(c, "p%d", i);
        string s = c;
        tanxin(s, i, out1, out2);
    }
    //read_data_from_file("p1", 1);
    return 0;
}
  • 最终结果和用时
resulttimes
p1103550
p290410
p3110410
p4130410
p5108270
p695130
p7115130
p8135130
p9103550
p1090410
p11110410
p12130410
p13119150
p1494260
p15130260
p16166260
p17119150
p1894260
p19130260
p20166260
p21119150
p2294260
p23130260
p24166260
p25166550
p26141250
p27189250
p28237250
p29174870
p30147500
p31199500
p32251500
p33170130
p34143800
p35193800
p36243800
p37165970
p38140670
p39188670
p40236670
p4188530
p42106810
p43135920
p44122800
p45129490
p46142150
p47141620
p48135430
p49136750
p50101060
p51108480
p52154420
p53144380
p54159410
p55145850
p56281410
p57371410.001
p58581410
p59433800
p60281410.001
p61371410
p62581410.001
p63433800
p64281410.001
p65371410
p66581410
p67436540
p68281410
p69371410
p70581410
p71433800
10355
1 1 1 1 1 1 1 1 1 1 
5 7 8 2 9 9 5 6 3 2 6 3 4 0 6 4 5 0 3 9 7 6 3 5 6 9 5 7 0 3 3 8 2 1 3 7 9 3 6 4 5 7 8 8 1 7 0 2 4 6 

9041
1 1 1 1 1 1 1 1 1 1 
5 7 8 2 9 9 5 6 3 2 6 3 4 0 6 4 5 0 3 9 7 6 3 5 6 9 5 7 0 3 3 8 2 1 3 7 9 3 6 4 5 7 8 8 1 7 0 2 4 6 

11041
1 1 1 1 1 1 1 1 1 1 
5 7 8 2 9 9 5 6 3 2 6 3 4 0 6 4 5 0 3 9 7 6 3 5 6 9 5 7 0 3 3 8 2 1 3 7 9 3 6 4 5 7 8 8 1 7 0 2 4 6 

13041
1 1 1 1 1 1 1 1 1 1 
5 7 8 2 9 9 5 6 3 2 6 3 4 0 6 4 5 0 3 9 7 6 3 5 6 9 5 7 0 3 3 8 2 1 3 7 9 3 6 4 5 7 8 8 1 7 0 2 4 6 

10827
1 1 1 1 1 1 1 1 1 1 
5 7 8 2 9 9 5 6 3 2 6 3 4 0 6 4 5 0 3 9 7 6 3 5 6 9 5 7 0 3 3 8 2 1 6 7 9 3 6 4 0 7 8 8 1 7 0 2 4 8 

9513
1 1 1 1 1 1 1 1 1 1 
5 7 8 2 9 9 5 6 3 2 6 3 4 0 6 4 5 0 3 9 7 6 3 5 6 9 5 7 0 3 3 8 2 1 6 7 9 3 6 4 0 7 8 8 1 7 0 2 4 8 

11513
1 1 1 1 1 1 1 1 1 1 
5 7 8 2 9 9 5 6 3 2 6 3 4 0 6 4 5 0 3 9 7 6 3 5 6 9 5 7 0 3 3 8 2 1 6 7 9 3 6 4 0 7 8 8 1 7 0 2 4 8 

13513
1 1 1 1 1 1 1 1 1 1 
5 7 8 2 9 9 5 6 3 2 6 3 4 0 6 4 5 0 3 9 7 6 3 5 6 9 5 7 0 3 3 8 2 1 6 7 9 3 6 4 0 7 8 8 1 7 0 2 4 8 

10355
1 1 1 1 1 1 1 1 1 1 
5 7 8 2 9 9 5 6 3 2 6 3 4 0 6 4 5 0 3 9 7 6 3 5 6 9 5 7 0 3 3 8 2 1 3 7 9 3 6 4 5 7 8 8 1 7 0 2 4 6 

9041
1 1 1 1 1 1 1 1 1 1 
5 7 8 2 9 9 5 6 3 2 6 3 4 0 6 4 5 0 3 9 7 6 3 5 6 9 5 7 0 3 3 8 2 1 3 7 9 3 6 4 5 7 8 8 1 7 0 2 4 6 

11041
1 1 1 1 1 1 1 1 1 1 
5 7 8 2 9 9 5 6 3 2 6 3 4 0 6 4 5 0 3 9 7 6 3 5 6 9 5 7 0 3 3 8 2 1 3 7 9 3 6 4 5 7 8 8 1 7 0 2 4 6 

13041
1 1 1 1 1 1 1 1 1 1 
5 7 8 2 9 9 5 6 3 2 6 3 4 0 6 4 5 0 3 9 7 6 3 5 6 9 5 7 0 3 3 8 2 1 3 7 9 3 6 4 5 7 8 8 1 7 0 2 4 6 

11915
1 1 0 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 
0 6 1 18 7 14 12 11 5 4 18 5 8 6 12 13 4 0 12 1 15 16 4 9 19 3 15 7 5 6 1 0 17 4 0 8 0 6 11 1 0 6 16 19 4 5 12 14 13 8 

9426
1 1 0 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 
0 6 1 18 7 14 12 11 5 4 18 5 8 6 12 13 4 0 12 1 15 16 4 9 19 3 15 7 5 6 1 0 17 4 0 8 0 6 11 1 0 6 16 19 4 5 12 14 13 8 

13026
1 1 0 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 
0 6 1 18 7 14 12 11 5 4 18 5 8 6 12 13 4 0 12 1 15 16 4 9 19 3 15 7 5 6 1 0 17 4 0 8 0 6 11 1 0 6 16 19 4 5 12 14 13 8 

16626
1 1 0 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 
0 6 1 18 7 14 12 11 5 4 18 5 8 6 12 13 4 0 12 1 15 16 4 9 19 3 15 7 5 6 1 0 17 4 0 8 0 6 11 1 0 6 16 19 4 5 12 14 13 8 

11915
1 1 0 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 
0 6 1 18 7 14 12 11 5 4 18 5 8 6 12 13 4 0 12 1 15 16 4 9 19 3 15 7 5 6 1 0 17 4 0 8 0 6 11 1 0 6 16 19 4 5 12 14 13 8 

9426
1 1 0 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 
0 6 1 18 7 14 12 11 5 4 18 5 8 6 12 13 4 0 12 1 15 16 4 9 19 3 15 7 5 6 1 0 17 4 0 8 0 6 11 1 0 6 16 19 4 5 12 14 13 8 

13026
1 1 0 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 
0 6 1 18 7 14 12 11 5 4 18 5 8 6 12 13 4 0 12 1 15 16 4 9 19 3 15 7 5 6 1 0 17 4 0 8 0 6 11 1 0 6 16 19 4 5 12 14 13 8 

16626
1 1 0 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 
0 6 1 18 7 14 12 11 5 4 18 5 8 6 12 13 4 0 12 1 15 16 4 9 19 3 15 7 5 6 1 0 17 4 0 8 0 6 11 1 0 6 16 19 4 5 12 14 13 8 

11915
1 1 0 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 
0 6 1 18 7 14 12 11 5 4 18 5 8 6 12 13 4 0 12 1 15 16 4 9 19 3 15 7 5 6 1 0 17 4 0 8 0 6 11 1 0 6 16 19 4 5 12 14 13 8 

9426
1 1 0 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 
0 6 1 18 7 14 12 11 5 4 18 5 8 6 12 13 4 0 12 1 15 16 4 9 19 3 15 7 5 6 1 0 17 4 0 8 0 6 11 1 0 6 16 19 4 5 12 14 13 8 

13026
1 1 0 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 
0 6 1 18 7 14 12 11 5 4 18 5 8 6 12 13 4 0 12 1 15 16 4 9 19 3 15 7 5 6 1 0 17 4 0 8 0 6 11 1 0 6 16 19 4 5 12 14 13 8 

16626
1 1 0 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 
0 6 1 18 7 14 12 11 5 4 18 5 8 6 12 13 4 0 12 1 15 16 4 9 19 3 15 7 5 6 1 0 17 4 0 8 0 6 11 1 0 6 16 19 4 5 12 14 13 8 

16655
0 1 0 1 1 1 1 1 1 1 1 1 1 1 0 1 0 1 1 1 1 1 1 1 1 1 1 1 0 0 
21 10 7 3 20 8 13 18 21 1 26 13 24 21 5 23 13 8 7 5 21 27 8 7 5 22 20 8 5 6 4 13 11 9 4 21 27 8 7 5 11 19 15 10 4 7 20 8 5 7 22 13 8 7 13 21 27 8 3 11 22 13 8 7 9 4 17 22 9 3 8 22 18 21 4 10 12 8 7 7 11 13 10 10 4 21 27 24 11 5 4 13 8 9 4 26 13 24 21 5 4 17 17 9 3 22 20 8 25 5 10 20 8 5 7 22 27 8 25 5 27 20 8 5 12 22 20 8 13 26 10 13 8 25 13 21 18 8 25 25 8 13 18 10 4 22 20 8 15 25 

14125
0 1 0 1 1 1 1 1 1 1 1 1 1 1 0 1 0 1 1 1 1 1 1 1 1 1 1 1 0 0 
21 10 7 3 20 8 13 18 21 1 26 13 24 21 5 23 13 8 7 5 21 27 8 7 5 22 20 8 5 6 4 13 11 9 4 21 27 8 7 5 11 19 15 10 4 7 20 8 5 7 22 13 8 7 13 21 27 8 3 11 22 13 8 7 9 4 17 22 9 3 8 22 18 21 4 10 12 8 7 7 11 13 10 10 4 21 27 24 11 5 4 13 8 9 4 26 13 24 21 5 4 17 17 9 3 22 20 8 25 5 10 20 8 5 7 22 27 8 25 5 27 20 8 5 12 22 20 8 13 26 10 13 8 25 13 21 18 8 25 25 8 13 18 10 4 22 20 8 15 25 

18925
0 1 0 1 1 1 1 1 1 1 1 1 1 1 0 1 0 1 1 1 1 1 1 1 1 1 1 1 0 0 
21 10 7 3 20 8 13 18 21 1 26 13 24 21 5 23 13 8 7 5 21 27 8 7 5 22 20 8 5 6 4 13 11 9 4 21 27 8 7 5 11 19 15 10 4 7 20 8 5 7 22 13 8 7 13 21 27 8 3 11 22 13 8 7 9 4 17 22 9 3 8 22 18 21 4 10 12 8 7 7 11 13 10 10 4 21 27 24 11 5 4 13 8 9 4 26 13 24 21 5 4 17 17 9 3 22 20 8 25 5 10 20 8 5 7 22 27 8 25 5 27 20 8 5 12 22 20 8 13 26 10 13 8 25 13 21 18 8 25 25 8 13 18 10 4 22 20 8 15 25 

23725
0 1 0 1 1 1 1 1 1 1 1 1 1 1 0 1 0 1 1 1 1 1 1 1 1 1 1 1 0 0 
21 10 7 3 20 8 13 18 21 1 26 13 24 21 5 23 13 8 7 5 21 27 8 7 5 22 20 8 5 6 4 13 11 9 4 21 27 8 7 5 11 19 15 10 4 7 20 8 5 7 22 13 8 7 13 21 27 8 3 11 22 13 8 7 9 4 17 22 9 3 8 22 18 21 4 10 12 8 7 7 11 13 10 10 4 21 27 24 11 5 4 13 8 9 4 26 13 24 21 5 4 17 17 9 3 22 20 8 25 5 10 20 8 5 7 22 27 8 25 5 27 20 8 5 12 22 20 8 13 26 10 13 8 25 13 21 18 8 25 25 8 13 18 10 4 22 20 8 15 25 

17487
0 1 0 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 
21 10 7 3 20 8 13 18 21 1 26 13 24 21 5 23 13 8 7 5 21 27 8 7 5 22 20 8 5 6 4 13 11 9 4 21 27 8 7 5 11 19 15 10 4 7 20 8 5 7 22 13 8 7 13 21 27 8 3 11 22 13 8 7 9 4 17 22 9 3 8 22 18 21 4 10 12 8 7 7 11 13 10 10 4 21 27 24 11 5 4 13 8 9 4 26 13 24 21 5 4 17 17 9 3 22 20 8 25 5 10 20 8 5 7 22 27 8 7 5 27 20 16 5 12 22 20 3 13 26 10 13 16 7 13 21 18 3 25 25 11 19 18 10 4 22 20 29 15 25 

14750
0 1 0 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 
21 10 7 3 20 8 13 18 21 1 26 13 24 21 5 23 13 8 7 5 21 27 8 7 5 22 20 8 5 6 4 13 11 9 4 21 27 8 7 5 11 19 15 10 4 7 20 8 5 7 22 13 8 7 13 21 27 8 3 11 22 13 8 7 9 4 17 22 9 3 8 22 18 21 4 10 12 8 7 7 11 13 10 10 4 21 27 24 11 5 4 13 8 9 4 26 13 24 21 5 4 17 17 9 3 22 20 8 25 5 10 20 8 5 7 22 27 8 7 5 27 20 16 5 12 22 20 3 13 26 10 13 16 7 13 21 18 3 25 25 11 19 18 10 4 22 20 29 15 25 

19950
0 1 0 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 
21 10 7 3 20 8 13 18 21 1 26 13 24 21 5 23 13 8 7 5 21 27 8 7 5 22 20 8 5 6 4 13 11 9 4 21 27 8 7 5 11 19 15 10 4 7 20 8 5 7 22 13 8 7 13 21 27 8 3 11 22 13 8 7 9 4 17 22 9 3 8 22 18 21 4 10 12 8 7 7 11 13 10 10 4 21 27 24 11 5 4 13 8 9 4 26 13 24 21 5 4 17 17 9 3 22 20 8 25 5 10 20 8 5 7 22 27 8 7 5 27 20 16 5 12 22 20 3 13 26 10 13 16 7 13 21 18 3 25 25 11 19 18 10 4 22 20 29 15 25 

25150
0 1 0 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 
21 10 7 3 20 8 13 18 21 1 26 13 24 21 5 23 13 8 7 5 21 27 8 7 5 22 20 8 5 6 4 13 11 9 4 21 27 8 7 5 11 19 15 10 4 7 20 8 5 7 22 13 8 7 13 21 27 8 3 11 22 13 8 7 9 4 17 22 9 3 8 22 18 21 4 10 12 8 7 7 11 13 10 10 4 21 27 24 11 5 4 13 8 9 4 26 13 24 21 5 4 17 17 9 3 22 20 8 25 5 10 20 8 5 7 22 27 8 7 5 27 20 16 5 12 22 20 3 13 26 10 13 16 7 13 21 18 3 25 25 11 19 18 10 4 22 20 29 15 25 

17013
0 1 0 1 1 1 1 1 1 1 1 1 1 1 0 1 0 1 1 1 1 1 1 1 1 1 1 1 0 1 
21 10 7 3 20 8 13 18 21 1 26 13 24 21 5 23 13 8 7 5 21 27 8 7 5 22 20 8 5 6 4 13 11 9 4 21 27 8 7 5 11 19 15 10 4 7 20 8 5 7 22 13 8 7 13 21 27 8 3 11 22 13 8 7 9 4 17 22 9 3 8 22 18 21 4 10 12 8 7 7 11 13 10 10 4 21 27 24 11 5 4 13 8 9 4 26 13 24 21 5 4 17 17 9 3 22 20 8 25 5 10 20 8 5 7 22 27 8 7 5 27 20 8 5 12 22 20 8 13 26 10 13 8 7 7 21 18 8 25 25 8 13 18 10 4 22 20 29 15 25 

14380
0 1 0 1 1 1 1 1 1 1 1 1 1 1 0 1 0 1 1 1 1 1 1 1 1 1 1 1 0 1 
21 10 7 3 20 8 13 18 21 1 26 13 24 21 5 23 13 8 7 5 21 27 8 7 5 22 20 8 5 6 4 13 11 9 4 21 27 8 7 5 11 19 15 10 4 7 20 8 5 7 22 13 8 7 13 21 27 8 3 11 22 13 8 7 9 4 17 22 9 3 8 22 18 21 4 10 12 8 7 7 11 13 10 10 4 21 27 24 11 5 4 13 8 9 4 26 13 24 21 5 4 17 17 9 3 22 20 8 25 5 10 20 8 5 7 22 27 8 7 5 27 20 8 5 12 22 20 8 13 26 10 13 8 7 7 21 18 8 25 25 8 13 18 10 4 22 20 29 15 25 

19380
0 1 0 1 1 1 1 1 1 1 1 1 1 1 0 1 0 1 1 1 1 1 1 1 1 1 1 1 0 1 
21 10 7 3 20 8 13 18 21 1 26 13 24 21 5 23 13 8 7 5 21 27 8 7 5 22 20 8 5 6 4 13 11 9 4 21 27 8 7 5 11 19 15 10 4 7 20 8 5 7 22 13 8 7 13 21 27 8 3 11 22 13 8 7 9 4 17 22 9 3 8 22 18 21 4 10 12 8 7 7 11 13 10 10 4 21 27 24 11 5 4 13 8 9 4 26 13 24 21 5 4 17 17 9 3 22 20 8 25 5 10 20 8 5 7 22 27 8 7 5 27 20 8 5 12 22 20 8 13 26 10 13 8 7 7 21 18 8 25 25 8 13 18 10 4 22 20 29 15 25 

24380
0 1 0 1 1 1 1 1 1 1 1 1 1 1 0 1 0 1 1 1 1 1 1 1 1 1 1 1 0 1 
21 10 7 3 20 8 13 18 21 1 26 13 24 21 5 23 13 8 7 5 21 27 8 7 5 22 20 8 5 6 4 13 11 9 4 21 27 8 7 5 11 19 15 10 4 7 20 8 5 7 22 13 8 7 13 21 27 8 3 11 22 13 8 7 9 4 17 22 9 3 8 22 18 21 4 10 12 8 7 7 11 13 10 10 4 21 27 24 11 5 4 13 8 9 4 26 13 24 21 5 4 17 17 9 3 22 20 8 25 5 10 20 8 5 7 22 27 8 7 5 27 20 8 5 12 22 20 8 13 26 10 13 8 7 7 21 18 8 25 25 8 13 18 10 4 22 20 29 15 25 

16597
0 1 0 1 1 1 1 1 1 1 1 1 1 1 0 1 0 1 1 1 1 1 1 1 1 1 1 1 0 0 
21 10 7 3 20 8 13 18 21 1 26 13 24 21 5 23 13 8 7 5 21 27 8 7 5 22 20 8 5 6 4 13 11 9 4 21 27 8 7 5 11 19 15 10 4 7 20 8 5 7 22 13 8 7 13 21 27 8 3 11 22 13 8 7 9 4 17 22 9 3 8 22 18 21 4 10 12 8 7 7 11 13 10 10 4 21 27 24 11 5 4 13 8 9 4 26 13 24 21 5 4 17 17 9 3 22 20 8 25 5 10 20 8 5 7 22 27 8 7 5 27 20 8 5 12 22 20 8 13 26 10 13 8 7 7 21 18 8 25 25 8 13 18 10 4 22 20 8 15 25 

14067
0 1 0 1 1 1 1 1 1 1 1 1 1 1 0 1 0 1 1 1 1 1 1 1 1 1 1 1 0 0 
21 10 7 3 20 8 13 18 21 1 26 13 24 21 5 23 13 8 7 5 21 27 8 7 5 22 20 8 5 6 4 13 11 9 4 21 27 8 7 5 11 19 15 10 4 7 20 8 5 7 22 13 8 7 13 21 27 8 3 11 22 13 8 7 9 4 17 22 9 3 8 22 18 21 4 10 12 8 7 7 11 13 10 10 4 21 27 24 11 5 4 13 8 9 4 26 13 24 21 5 4 17 17 9 3 22 20 8 25 5 10 20 8 5 7 22 27 8 7 5 27 20 8 5 12 22 20 8 13 26 10 13 8 7 7 21 18 8 25 25 8 13 18 10 4 22 20 8 15 25 

18867
0 1 0 1 1 1 1 1 1 1 1 1 1 1 0 1 0 1 1 1 1 1 1 1 1 1 1 1 0 0 
21 10 7 3 20 8 13 18 21 1 26 13 24 21 5 23 13 8 7 5 21 27 8 7 5 22 20 8 5 6 4 13 11 9 4 21 27 8 7 5 11 19 15 10 4 7 20 8 5 7 22 13 8 7 13 21 27 8 3 11 22 13 8 7 9 4 17 22 9 3 8 22 18 21 4 10 12 8 7 7 11 13 10 10 4 21 27 24 11 5 4 13 8 9 4 26 13 24 21 5 4 17 17 9 3 22 20 8 25 5 10 20 8 5 7 22 27 8 7 5 27 20 8 5 12 22 20 8 13 26 10 13 8 7 7 21 18 8 25 25 8 13 18 10 4 22 20 8 15 25 

23667
0 1 0 1 1 1 1 1 1 1 1 1 1 1 0 1 0 1 1 1 1 1 1 1 1 1 1 1 0 0 
21 10 7 3 20 8 13 18 21 1 26 13 24 21 5 23 13 8 7 5 21 27 8 7 5 22 20 8 5 6 4 13 11 9 4 21 27 8 7 5 11 19 15 10 4 7 20 8 5 7 22 13 8 7 13 21 27 8 3 11 22 13 8 7 9 4 17 22 9 3 8 22 18 21 4 10 12 8 7 7 11 13 10 10 4 21 27 24 11 5 4 13 8 9 4 26 13 24 21 5 4 17 17 9 3 22 20 8 25 5 10 20 8 5 7 22 27 8 7 5 27 20 8 5 12 22 20 8 13 26 10 13 8 7 7 21 18 8 25 25 8 13 18 10 4 22 20 8 15 25 

8853
1 1 1 1 1 1 1 1 1 1 
2 8 8 1 6 8 4 3 0 3 9 1 8 9 1 2 2 6 4 2 0 5 0 6 6 7 1 7 7 9 4 3 7 3 4 0 2 0 7 1 9 0 9 2 0 0 0 5 1 5 7 3 9 0 3 9 0 7 8 1 5 8 6 4 6 5 5 7 5 3 5 0 8 8 9 0 6 7 3 9 3 5 4 5 5 7 4 5 6 6 

10681
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 
16 17 0 6 9 19 0 6 17 8 16 5 2 6 2 5 7 9 2 2 3 0 5 4 12 11 9 12 9 10 12 6 11 13 6 11 3 2 4 4 1 15 18 10 2 6 4 4 0 4 16 0 7 9 14 5 19 14 17 10 4 17 8 7 6 7 10 6 8 8 11 6 5 11 7 15 14 11 7 8 

13592
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 
20 21 18 22 16 21 18 12 15 10 9 23 20 4 27 24 29 16 1 6 10 13 22 19 10 22 29 9 14 11 22 13 8 15 5 17 8 22 26 25 14 8 14 23 11 14 6 13 17 7 20 15 2 7 1 3 3 13 14 0 26 11 6 26 12 7 22 18 16 23 

12280
1 1 1 1 1 1 1 1 1 1 
9 1 1 6 1 2 9 3 7 8 7 0 0 3 0 7 4 8 8 7 8 0 4 4 7 5 4 0 1 7 4 8 3 3 2 5 3 1 1 7 0 2 1 0 9 5 1 1 6 7 9 0 3 9 8 2 2 6 6 0 5 7 6 9 9 2 6 6 7 0 3 0 8 7 7 6 5 5 7 5 4 5 7 7 6 4 4 2 2 3 

12949
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 
3 18 15 2 8 19 4 9 18 0 0 1 17 0 1 5 17 6 2 7 0 12 16 17 14 19 17 2 7 0 7 19 17 0 10 16 18 0 18 1 7 0 18 9 17 8 2 16 17 7 3 7 8 0 11 12 17 14 16 14 9 19 17 2 1 14 5 17 17 14 12 13 9 19 14 10 1 18 15 10 

14215
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 0 1 1 1 1 1 1 1 
5 4 18 19 11 8 14 17 6 0 2 9 13 7 24 7 6 7 2 19 12 29 2 13 14 29 4 13 7 11 9 28 17 28 26 7 12 1 28 6 27 7 8 16 3 21 10 0 2 20 12 19 23 3 24 13 25 14 6 24 4 28 24 29 21 5 29 12 24 10 

14162
1 1 1 1 1 1 1 1 1 1 
2 8 0 8 1 9 7 9 7 9 3 6 1 6 9 7 9 8 8 9 1 8 6 9 7 9 0 8 7 7 0 6 2 1 7 0 8 7 1 9 0 6 0 7 0 3 7 7 5 7 0 0 1 0 3 7 1 6 1 4 6 7 7 0 7 2 5 7 4 5 2 7 3 7 2 6 3 5 7 7 7 2 2 2 6 3 5 6 6 5 

13543
1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 0 0 1 1 
3 0 12 0 6 0 12 0 12 1 1 0 13 3 1 0 15 0 1 0 19 1 1 0 18 5 14 11 18 9 14 11 15 12 1 11 18 18 13 11 15 11 5 3 15 11 4 11 15 11 10 11 15 12 12 11 3 11 18 2 3 12 18 4 3 12 9 5 3 13 9 10 2 3 9 13 2 3 9 15 

13675
1 1 1 1 1 1 0 1 0 0 1 0 1 1 1 1 1 1 0 1 1 1 1 1 0 1 1 1 1 1 
0 22 12 1 25 5 12 10 22 20 1 29 1 12 13 3 27 0 2 12 0 22 5 26 3 29 15 7 27 0 23 10 1 23 7 28 4 2 19 1 28 0 27 14 23 25 12 17 7 27 20 0 28 3 28 14 2 27 0 23 10 3 21 3 29 4 23 16 2 27 

10106
1 1 1 1 1 1 1 1 1 1 
3 1 0 9 0 5 8 2 8 1 5 2 6 6 1 2 0 2 8 1 5 7 6 6 4 9 8 5 2 5 0 9 6 2 9 0 8 5 0 5 2 1 7 9 9 2 8 5 0 5 6 7 6 5 5 1 8 5 7 5 1 2 0 9 0 2 7 2 8 1 0 7 6 0 7 1 2 5 7 5 5 7 6 9 4 1 7 5 7 5 5 2 6 6 3 2 8 2 3 7 

10848
1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 
1 19 12 13 11 9 6 11 8 9 6 6 11 8 7 11 7 12 19 8 5 6 12 8 8 6 15 11 8 7 1 19 16 12 11 0 6 11 8 7 6 6 11 8 7 0 6 11 9 7 3 19 15 12 8 5 7 17 15 15 5 6 19 0 3 5 16 19 0 10 11 19 14 19 11 0 12 10 9 0 7 6 19 0 2 0 7 9 15 0 5 16 19 0 11 2 13 9 17 0 

15442
1 1 1 1 1 1 1 1 1 1 
8 9 3 8 8 2 4 9 9 0 1 9 3 8 0 3 6 9 0 1 5 1 3 8 5 4 7 9 9 7 5 2 3 6 6 2 4 3 1 7 5 3 3 8 6 2 4 2 1 7 5 7 3 2 7 5 2 0 4 4 2 1 3 6 3 3 0 0 0 2 7 3 3 6 5 4 7 2 7 7 5 7 3 2 8 5 5 3 2 0 5 7 7 2 0 5 6 0 4 4 

14438
1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 0 1 1 1 
19 3 12 4 9 8 3 11 13 9 19 3 15 1 14 19 3 11 13 9 8 3 11 4 9 5 18 5 7 19 13 3 12 8 17 13 3 12 4 9 19 3 15 19 11 19 9 15 1 14 11 3 12 8 17 19 3 15 19 10 19 0 8 5 2 19 3 8 5 2 1 18 13 19 0 19 3 15 2 4 1 18 14 7 19 19 18 13 10 12 2 18 1 0 0 13 3 12 4 1 

15941
1 1 1 1 1 1 1 1 1 1 
4 9 0 9 0 4 4 6 9 0 9 9 3 9 2 1 6 4 9 0 9 0 2 5 2 1 6 4 8 0 4 0 3 5 8 1 6 4 8 0 4 0 2 3 2 1 4 4 5 0 4 0 0 3 2 4 6 3 8 7 4 6 3 0 2 4 7 1 8 7 2 2 2 3 2 1 6 4 8 8 4 6 3 3 2 8 6 4 8 7 4 3 2 3 2 4 6 4 8 5 

14585
1 0 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 0 1 1 
19 19 8 6 9 19 0 2 6 9 9 2 2 14 9 19 0 2 4 9 4 2 2 14 10 4 2 2 4 8 19 3 11 6 9 19 19 14 7 9 13 2 2 14 18 19 19 0 16 9 19 19 0 7 9 19 19 0 0 10 19 6 2 6 10 19 19 2 4 5 19 3 11 6 10 4 2 2 4 2 2 2 2 14 10 0 2 6 14 15 0 0 6 14 15 19 19 0 8 10 

28141
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 
0 20 1 15 9 3 8 3 6 25 9 4 10 14 9 2 7 16 16 20 16 16 4 19 17 8 7 0 3 16 4 5 7 3 2 16 7 24 24 10 1 12 12 1 3 22 12 5 22 19 17 14 24 4 17 4 5 5 14 15 17 27 13 25 15 21 5 14 9 10 18 3 2 8 0 15 16 11 3 14 5 25 11 23 20 5 15 2 24 15 9 29 0 27 29 17 20 29 11 3 6 9 19 11 27 7 1 23 13 9 25 1 29 21 7 17 18 8 11 18 0 10 10 13 28 15 21 20 8 2 23 12 12 9 16 26 5 23 14 1 2 17 19 11 6 19 11 8 18 9 8 11 5 22 4 25 0 24 12 17 23 8 19 17 26 0 2 5 29 23 2 14 24 20 23 10 2 14 27 4 26 4 28 22 28 15 29 1 28 29 16 8 26 20 8 10 4 1 27 8 

37141
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 
0 20 1 15 9 3 8 3 6 25 9 4 10 14 9 2 7 16 16 20 16 16 4 19 17 8 7 0 3 16 4 5 7 3 2 16 7 24 24 10 1 12 12 1 3 22 12 5 22 19 17 14 24 4 17 4 5 5 14 15 17 27 13 25 15 21 5 14 9 10 18 3 2 8 0 15 16 11 3 14 5 25 11 23 20 5 15 2 24 15 9 29 0 27 29 17 20 29 11 3 6 9 19 11 27 7 1 23 13 9 25 1 29 21 7 17 18 8 11 18 0 10 10 13 28 15 21 20 8 2 23 12 12 9 16 26 5 23 14 1 2 17 19 11 6 19 11 8 18 9 8 11 5 22 4 25 0 24 12 17 23 8 19 17 26 0 2 5 29 23 2 14 24 20 23 10 2 14 27 4 26 4 28 22 28 15 29 1 28 29 16 8 26 20 8 10 4 1 27 8 

58141
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 
0 20 1 15 9 3 8 3 6 25 9 4 10 14 9 2 7 16 16 20 16 16 4 19 17 8 7 0 3 16 4 5 7 3 2 16 7 24 24 10 1 12 12 1 3 22 12 5 22 19 17 14 24 4 17 4 5 5 14 15 17 27 13 25 15 21 5 14 9 10 18 3 2 8 0 15 16 11 3 14 5 25 11 23 20 5 15 2 24 15 9 29 0 27 29 17 20 29 11 3 6 9 19 11 27 7 1 23 13 9 25 1 29 21 7 17 18 8 11 18 0 10 10 13 28 15 21 20 8 2 23 12 12 9 16 26 5 23 14 1 2 17 19 11 6 19 11 8 18 9 8 11 5 22 4 25 0 24 12 17 23 8 19 17 26 0 2 5 29 23 2 14 24 20 23 10 2 14 27 4 26 4 28 22 28 15 29 1 28 29 16 8 26 20 8 10 4 1 27 8 

43380
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 
0 20 1 15 9 3 8 3 6 25 9 4 10 14 9 2 7 16 16 20 16 16 4 19 17 8 7 0 3 16 4 5 7 3 2 16 7 24 24 10 1 12 12 1 3 22 12 5 22 19 17 14 24 4 17 4 5 5 14 15 17 27 13 25 15 21 5 14 9 10 18 3 2 8 0 15 16 11 3 14 5 25 11 23 20 5 15 2 24 15 9 29 0 27 29 17 20 29 11 3 6 9 19 11 27 7 1 23 13 9 25 1 29 21 7 17 18 8 11 18 0 10 10 13 28 15 21 20 8 2 23 12 12 9 16 26 5 23 14 1 2 17 19 11 6 19 11 8 18 9 8 11 5 22 4 25 0 24 12 17 23 8 19 17 26 0 2 5 29 23 2 14 24 20 23 10 2 14 27 4 26 4 28 22 28 15 29 1 28 29 16 8 26 20 8 10 4 1 27 8 

28141
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 
0 20 1 15 9 3 8 3 6 25 9 4 10 14 9 2 7 16 16 20 16 16 4 19 17 8 7 0 3 16 4 5 7 3 2 16 7 24 24 10 1 12 12 1 3 22 12 5 22 19 17 14 24 4 17 4 5 5 14 15 17 27 13 25 15 21 5 14 9 10 18 3 2 8 0 15 16 11 3 14 5 25 11 23 20 5 15 2 24 15 9 29 0 27 29 17 20 29 11 3 6 9 19 11 27 7 1 23 13 9 25 1 29 21 7 17 18 8 11 18 0 10 10 13 28 15 21 20 8 2 23 12 12 9 16 26 5 23 14 1 2 17 19 11 6 19 11 8 18 9 8 11 5 22 4 25 0 24 12 17 23 8 19 17 26 0 2 5 29 23 2 14 24 20 23 10 2 14 27 4 26 4 28 22 28 15 29 1 28 29 16 8 26 20 8 10 4 1 27 8 

37141
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 
0 20 1 15 9 3 8 3 6 25 9 4 10 14 9 2 7 16 16 20 16 16 4 19 17 8 7 0 3 16 4 5 7 3 2 16 7 24 24 10 1 12 12 1 3 22 12 5 22 19 17 14 24 4 17 4 5 5 14 15 17 27 13 25 15 21 5 14 9 10 18 3 2 8 0 15 16 11 3 14 5 25 11 23 20 5 15 2 24 15 9 29 0 27 29 17 20 29 11 3 6 9 19 11 27 7 1 23 13 9 25 1 29 21 7 17 18 8 11 18 0 10 10 13 28 15 21 20 8 2 23 12 12 9 16 26 5 23 14 1 2 17 19 11 6 19 11 8 18 9 8 11 5 22 4 25 0 24 12 17 23 8 19 17 26 0 2 5 29 23 2 14 24 20 23 10 2 14 27 4 26 4 28 22 28 15 29 1 28 29 16 8 26 20 8 10 4 1 27 8 

58141
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 
0 20 1 15 9 3 8 3 6 25 9 4 10 14 9 2 7 16 16 20 16 16 4 19 17 8 7 0 3 16 4 5 7 3 2 16 7 24 24 10 1 12 12 1 3 22 12 5 22 19 17 14 24 4 17 4 5 5 14 15 17 27 13 25 15 21 5 14 9 10 18 3 2 8 0 15 16 11 3 14 5 25 11 23 20 5 15 2 24 15 9 29 0 27 29 17 20 29 11 3 6 9 19 11 27 7 1 23 13 9 25 1 29 21 7 17 18 8 11 18 0 10 10 13 28 15 21 20 8 2 23 12 12 9 16 26 5 23 14 1 2 17 19 11 6 19 11 8 18 9 8 11 5 22 4 25 0 24 12 17 23 8 19 17 26 0 2 5 29 23 2 14 24 20 23 10 2 14 27 4 26 4 28 22 28 15 29 1 28 29 16 8 26 20 8 10 4 1 27 8 

43380
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 
0 20 1 15 9 3 8 3 6 25 9 4 10 14 9 2 7 16 16 20 16 16 4 19 17 8 7 0 3 16 4 5 7 3 2 16 7 24 24 10 1 12 12 1 3 22 12 5 22 19 17 14 24 4 17 4 5 5 14 15 17 27 13 25 15 21 5 14 9 10 18 3 2 8 0 15 16 11 3 14 5 25 11 23 20 5 15 2 24 15 9 29 0 27 29 17 20 29 11 3 6 9 19 11 27 7 1 23 13 9 25 1 29 21 7 17 18 8 11 18 0 10 10 13 28 15 21 20 8 2 23 12 12 9 16 26 5 23 14 1 2 17 19 11 6 19 11 8 18 9 8 11 5 22 4 25 0 24 12 17 23 8 19 17 26 0 2 5 29 23 2 14 24 20 23 10 2 14 27 4 26 4 28 22 28 15 29 1 28 29 16 8 26 20 8 10 4 1 27 8 

28141
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 
0 20 1 15 9 3 8 3 6 25 9 4 10 14 9 2 7 16 16 20 16 16 4 19 17 8 7 0 3 16 4 5 7 3 2 16 7 24 24 10 1 12 12 1 3 22 12 5 22 19 17 14 24 4 17 4 5 5 14 15 17 27 13 25 15 21 5 14 9 10 18 3 2 8 0 15 16 11 3 14 5 25 11 23 20 5 15 2 24 15 9 29 0 27 29 17 20 29 11 3 6 9 19 11 27 7 1 23 13 9 25 1 29 21 7 17 18 8 11 18 0 10 10 13 28 15 21 20 8 2 23 12 12 9 16 26 5 23 14 1 2 17 19 11 6 19 11 8 18 9 8 11 5 22 4 25 0 24 12 17 23 8 19 17 26 0 2 5 29 23 2 14 24 20 23 10 2 14 27 4 26 4 28 22 28 15 29 1 28 29 16 8 26 20 8 10 4 1 27 8 

37141
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 
0 20 1 15 9 3 8 3 6 25 9 4 10 14 9 2 7 16 16 20 16 16 4 19 17 8 7 0 3 16 4 5 7 3 2 16 7 24 24 10 1 12 12 1 3 22 12 5 22 19 17 14 24 4 17 4 5 5 14 15 17 27 13 25 15 21 5 14 9 10 18 3 2 8 0 15 16 11 3 14 5 25 11 23 20 5 15 2 24 15 9 29 0 27 29 17 20 29 11 3 6 9 19 11 27 7 1 23 13 9 25 1 29 21 7 17 18 8 11 18 0 10 10 13 28 15 21 20 8 2 23 12 12 9 16 26 5 23 14 1 2 17 19 11 6 19 11 8 18 9 8 11 5 22 4 25 0 24 12 17 23 8 19 17 26 0 2 5 29 23 2 14 24 20 23 10 2 14 27 4 26 4 28 22 28 15 29 1 28 29 16 8 26 20 8 10 4 1 27 8 

58141
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 
0 20 1 15 9 3 8 3 6 25 9 4 10 14 9 2 7 16 16 20 16 16 4 19 17 8 7 0 3 16 4 5 7 3 2 16 7 24 24 10 1 12 12 1 3 22 12 5 22 19 17 14 24 4 17 4 5 5 14 15 17 27 13 25 15 21 5 14 9 10 18 3 2 8 0 15 16 11 3 14 5 25 11 23 20 5 15 2 24 15 9 29 0 27 29 17 20 29 11 3 6 9 19 11 27 7 1 23 13 9 25 1 29 21 7 17 18 8 11 18 0 10 10 13 28 15 21 20 8 2 23 12 12 9 16 26 5 23 14 1 2 17 19 11 6 19 11 8 18 9 8 11 5 22 4 25 0 24 12 17 23 8 19 17 26 0 2 5 29 23 2 14 24 20 23 10 2 14 27 4 26 4 28 22 28 15 29 1 28 29 16 8 26 20 8 10 4 1 27 8 

43654
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 
0 19 0 7 8 2 7 2 23 4 8 29 9 13 8 1 6 15 15 19 15 15 3 18 16 7 29 21 2 15 3 4 6 2 1 15 6 23 23 9 29 11 11 0 2 21 11 29 21 18 16 13 23 3 16 3 1 4 13 14 16 26 21 29 14 20 4 13 8 9 17 2 1 7 21 14 11 10 2 13 4 24 10 22 19 4 14 1 23 14 8 28 1 26 28 16 29 28 10 2 5 8 18 10 26 6 0 22 12 8 24 16 28 0 6 16 17 7 10 29 14 9 9 12 27 14 20 19 7 1 22 11 11 8 15 25 4 22 13 0 1 16 18 10 5 18 10 7 10 8 7 10 4 21 3 24 4 23 11 16 22 7 18 16 29 12 1 4 28 22 1 13 23 19 22 22 1 13 26 3 25 3 27 21 27 14 28 0 27 28 15 7 25 19 7 9 3 0 26 7 

28141
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 
0 20 1 15 9 3 8 3 6 25 9 4 10 14 9 2 7 16 16 20 16 16 4 19 17 8 7 0 3 16 4 5 7 3 2 16 7 24 24 10 1 12 12 1 3 22 12 5 22 19 17 14 24 4 17 4 5 5 14 15 17 27 13 25 15 21 5 14 9 10 18 3 2 8 0 15 16 11 3 14 5 25 11 23 20 5 15 2 24 15 9 29 0 27 29 17 20 29 11 3 6 9 19 11 27 7 1 23 13 9 25 1 29 21 7 17 18 8 11 18 0 10 10 13 28 15 21 20 8 2 23 12 12 9 16 26 5 23 14 1 2 17 19 11 6 19 11 8 18 9 8 11 5 22 4 25 0 24 12 17 23 8 19 17 26 0 2 5 29 23 2 14 24 20 23 10 2 14 27 4 26 4 28 22 28 15 29 1 28 29 16 8 26 20 8 10 4 1 27 8 

37141
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 
0 20 1 15 9 3 8 3 6 25 9 4 10 14 9 2 7 16 16 20 16 16 4 19 17 8 7 0 3 16 4 5 7 3 2 16 7 24 24 10 1 12 12 1 3 22 12 5 22 19 17 14 24 4 17 4 5 5 14 15 17 27 13 25 15 21 5 14 9 10 18 3 2 8 0 15 16 11 3 14 5 25 11 23 20 5 15 2 24 15 9 29 0 27 29 17 20 29 11 3 6 9 19 11 27 7 1 23 13 9 25 1 29 21 7 17 18 8 11 18 0 10 10 13 28 15 21 20 8 2 23 12 12 9 16 26 5 23 14 1 2 17 19 11 6 19 11 8 18 9 8 11 5 22 4 25 0 24 12 17 23 8 19 17 26 0 2 5 29 23 2 14 24 20 23 10 2 14 27 4 26 4 28 22 28 15 29 1 28 29 16 8 26 20 8 10 4 1 27 8 

58141
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 
0 20 1 15 9 3 8 3 6 25 9 4 10 14 9 2 7 16 16 20 16 16 4 19 17 8 7 0 3 16 4 5 7 3 2 16 7 24 24 10 1 12 12 1 3 22 12 5 22 19 17 14 24 4 17 4 5 5 14 15 17 27 13 25 15 21 5 14 9 10 18 3 2 8 0 15 16 11 3 14 5 25 11 23 20 5 15 2 24 15 9 29 0 27 29 17 20 29 11 3 6 9 19 11 27 7 1 23 13 9 25 1 29 21 7 17 18 8 11 18 0 10 10 13 28 15 21 20 8 2 23 12 12 9 16 26 5 23 14 1 2 17 19 11 6 19 11 8 18 9 8 11 5 22 4 25 0 24 12 17 23 8 19 17 26 0 2 5 29 23 2 14 24 20 23 10 2 14 27 4 26 4 28 22 28 15 29 1 28 29 16 8 26 20 8 10 4 1 27 8 

43380
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 
0 20 1 15 9 3 8 3 6 25 9 4 10 14 9 2 7 16 16 20 16 16 4 19 17 8 7 0 3 16 4 5 7 3 2 16 7 24 24 10 1 12 12 1 3 22 12 5 22 19 17 14 24 4 17 4 5 5 14 15 17 27 13 25 15 21 5 14 9 10 18 3 2 8 0 15 16 11 3 14 5 25 11 23 20 5 15 2 24 15 9 29 0 27 29 17 20 29 11 3 6 9 19 11 27 7 1 23 13 9 25 1 29 21 7 17 18 8 11 18 0 10 10 13 28 15 21 20 8 2 23 12 12 9 16 26 5 23 14 1 2 17 19 11 6 19 11 8 18 9 8 11 5 22 4 25 0 24 12 17 23 8 19 17 26 0 2 5 29 23 2 14 24 20 23 10 2 14 27 4 26 4 28 22 28 15 29 1 28 29 16 8 26 20 8 10 4 1 27 8 


模拟退火法

模拟火法的思路也很简单,先让用户随机选择工厂,只有在退火过程中选择新的方式产生新解,主要用了一下三种方式:随机交换两个用户服务的工程,随机替换两个用户的工程,将两个用户之间所有用户的工厂进行逆转。
模拟退火法的结果比贪心算法的结果稍微好了一点点,但也只是一点点,可能是生成新解的方法不够好,以及参数设得也不够好吧
代码:
SA.hpp

#ifndef SA_H_
#define SA_H_
#include <vector>
#include <string>
#include <fstream>
using namespace std;
struct factory
{
    int open_cost;
    int rest;
    int serve_num = 0; // 服务的人数
};

class SA
{
public:
    SA(){}
    ~SA(){}
    void read_data(string file_name, int m);
    void init_result();
    int get_total_cost(vector<int> v, vector<factory> fs); // 获取所有的费用
    void generate_new_result(); // 生成新街
    void SA_MAIN(string file_name, int m, ofstream& out1, ofstream& out2);
    void print_result(string file_name, double times, ofstream& out1, ofstream& out2);
private:
    vector<int> capacity_need;
    vector<vector<int> > server_cost;

    vector<factory> factories;
    int m;
    int factory_num;
    int user_num;
    string file_dir = "../Instances/";
    int total_cost;
    vector<int> server_factories;

    bool can_swap(vector<int> v, vector<factory> fs, int i, int j);
    bool can_replace(vector<factory> fs, int i, int j);
    int currentTemplate;
    const int MAPKOB_LENGTH = 500;
    const double SPEED = 0.98;
    double INITIAL_TEMPERATURE = 500.0;  // 初始温度
    const double MIN_TEMPERATURE = 0.1;
};

#endif

SA.cpp

#include "SA.hpp"
#include <iostream>
#include <fstream>
#include <time.h>
#include <stdlib.h>
#include <algorithm>
#include <time.h>

void SA::read_data(string file_name, int m) {
    ifstream in;
    in.open((file_dir + file_name).c_str());
    in >> factory_num >> user_num;
    for (int i = 0; i < factory_num; ++i) {
        factory f;
        in >> f.rest;
        in >> f.open_cost;
        factories.push_back(f);
        //cout << f.rest << " " << f.open_cost <<endl;
    }

    int temp;
    char c;
    for (int i = 0; i < user_num; ++i) {
        in >> temp >> c;
        capacity_need.push_back(temp);
    }

    for (int i = 0; i < user_num; ++i) {
        vector<int> v;
        for (int j = 0; j < factory_num; ++j) {
            if (m >= 56) in >> temp;
            else in >> temp >> c;
            v.push_back(temp);
            //cout << v[j] << " ";
        }
        server_cost.push_back(v);
        //cout << endl;
    }
}

void SA::init_result() {
    
    /*for (int i = 0; i < user_num; ++i) {
        int f = rand() % factory_num;
        while(factories[f].rest < capacity_need[i]) {
            f = rand() % factory_num;
        }
        factories[f].rest -= capacity_need[i];
        factories[f].serve_num += 1;
        server_factories.push_back(f);
    }
    total_cost = get_total_cost(server_factories, factories);*/
    for (int i = 0; i  < user_num; ++i) {
        int cost = INT_MAX;
        int k  = -1;
        for (int j = 0; j < factory_num; ++j) {
            if (cost > server_cost[i][j]) {
                cost = server_cost[i][j];
                k = j;
            }
        }
        server_factories.push_back(k);
        factories[k].rest -= capacity_need[i];
        factories[k].serve_num += 1;
    }
    total_cost = get_total_cost(server_factories, factories);
}

// int SA::test() {
//     return get_total_cost(server_factories, factories);
// }

int SA::get_total_cost(vector<int> v, vector<factory> fs) {
    int total = 0;
    for (int i = 0; i < factory_num; ++i) {
        if(fs[i].serve_num > 0)
            total += fs[i].open_cost;
    }
    for (int i = 0; i < user_num; ++i) {
        total += server_cost[i][v[i]];
    }
    return total;
}

bool SA::can_swap(vector<int> v, vector<factory> fs, int i, int j) {
    return (fs[v[i]].rest + capacity_need[i]> capacity_need[j]) && (fs[v[j]].rest + capacity_need[j] > capacity_need[i]);
}

 bool SA::can_replace(vector<factory> fs, int i, int j) {
    return fs[j].rest >= capacity_need[i] ;
 }

void SA::generate_new_result() {
    vector<int> new_result = server_factories;
    vector<factory> new_factories = factories;
    int i = rand() % user_num;
    int j = rand() % user_num;
    if (i > j) {
        int temp = i;
        i = j;
        j = temp;
    }
    int proportion[4] = {10, 25, 1, 0};
    int len = proportion[0] + proportion[1] + proportion[2] + proportion[3];
    int k = rand() % len;
    //cout << k << endl;
    //int k = 3;
    // 交换两个人的工厂
    if (k < proportion[0]) {
        if(can_swap(new_result, new_factories, i, j)) {
            new_factories[new_result[i]].rest = new_factories[new_result[i]].rest + capacity_need[i] - capacity_need[j];
            new_factories[new_result[j]].rest = new_factories[new_result[j]].rest + capacity_need[j] - capacity_need[i];
            int temp = new_result[i];
            new_result[i] = new_result[j];
            new_result[j] = temp;

        }
    }

    // 将两个人的工厂替换为其它的工厂
    else if ( k < + proportion[0] + proportion[1]) {
        int m = rand() % factory_num;
        int n = rand() % factory_num;
        int a = 0;
        while(!can_replace(new_factories, i, m)) {
            m = rand() % factory_num;
            ++a;
            if (a > factory_num * 10) {
                return;
            }
        }
        new_factories[new_result[i]].rest += capacity_need[i];
        new_factories[new_result[i]].serve_num -= 1;
        new_factories[m].rest -= capacity_need[i];
        new_factories[m].serve_num +=1;
        new_result[i] = m;

        a = 0;
        while(!can_replace(new_factories, j, n)) {
            n = rand() % factory_num;
            ++a;
            if (a > factory_num * 10) {
                return;
            }
        }
        
        new_factories[new_result[j]].rest += capacity_need[j];
        new_factories[new_result[j]].serve_num -= 1;
        new_factories[n].rest -= capacity_need[j];
        new_factories[n].serve_num +=1;
        new_result[j] = n;
    }
    else if(k < proportion[0] + proportion[1] + proportion[2]) {
        while (i < j) {
            if(can_swap(new_result, new_factories, i, j)) {
                new_factories[new_result[i]].rest = new_factories[new_result[i]].rest + capacity_need[i] - capacity_need[j];
                new_factories[new_result[j]].rest = new_factories[new_result[j]].rest + capacity_need[j] - capacity_need[i];
                int temp = new_result[i];
                new_result[i] = new_result[j];
                new_result[j] = temp;
            }
            ++i;
            --j;
        }
    }
    else {
        while(i <= j) {
            int m = rand() % factory_num;
            while (!can_replace(new_factories, i, m)) {
                m = rand() % factory_num;
            }
            new_factories[new_result[i]].rest += capacity_need[i];
            new_factories[new_result[i]].serve_num -= 1;
            new_factories[m].rest -= capacity_need[i];
            new_factories[m].serve_num +=1;
            new_result[i] = m;
            ++i;
        }
    }

    int new_total = get_total_cost(new_result, new_factories);
    if(new_total < total_cost) {
       /* cout << "new" << endl;
        cout << new_total << endl;*/
        server_factories = new_result;
        factories = new_factories;
        total_cost = new_total;
    }
    else {
        if(exp((total_cost - new_total) * 1.0 / currentTemplate) > (rand() * 1.0 / RAND_MAX)){
            server_factories = new_result;
            factories = new_factories;
            total_cost = new_total;
        }
    }
}

void SA::SA_MAIN(string file_name, int m, ofstream& out1, ofstream& out2) {
    read_data(file_name, m);
    srand(time(0));
    
    clock_t start,end;
    start = clock();
    init_result();
    currentTemplate = INITIAL_TEMPERATURE;
    while(MIN_TEMPERATURE < currentTemplate) {
        for (int i = 0; i < MAPKOB_LENGTH; ++i) {
            generate_new_result();
        }
        currentTemplate *= SPEED;
    }
    end = clock();
    print_result(file_name, (double)(end-start)/CLK_TCK, out1, out2);
}

void SA::print_result(string file, double times, ofstream& out1, ofstream& out2) {

    out1 << "|" << file << "|" << total_cost << "|" << times << "|" << endl;

    out2 << total_cost << endl;
    for (int i = 0; i < factory_num; ++i) {
        out2 << (factories[i].serve_num > 0) << ", " ;
    }
   /* cout << endl;
    for (int i = 0; i < factory_num; ++i) {
        cout << factories[i].rest << ", ";
    }*/
    out2 << endl;
    for (int i = 0; i < user_num; ++i) {
        out2 << server_factories[i] << ", ";
    }
    out2 << endl << endl;
}

main.cpp

#include "SA.hpp"
#include <iostream>
#include <fstream>
using namespace std;
int main() {
    ofstream out1;
    out1.open("./1.txt");
    ofstream out2;
    out2.open("./2.txt");
    for (int i = 1; i <= 71; ++i) {
        SA sa = SA();
        char filename[3];
        sprintf(filename, "p%d",  i);
        sa.SA_MAIN(filename, i, out1, out2);
    }
    cout << endl;
    return 0;
}
  • 结果
Resulttimes
p1100440.33
p291680.322
p3105140.322
p4120790.338
p5103210.339
p693100.337
p7108140.337
p8126820.354
p997880.418
p1089310.323
p11103480.362
p12117200.376
p1397000.443
p1488660.368
p15103840.366
p16123450.372
p1793320.364
p1884520.371
p19104150.495
p20128840.451
p2193030.427
p2282360.44
p23103680.371
p24121920.378
p25158050.836
p26127701.029
p27164711.028
p28192071.052
p29160551.091
p30142920.887
p31173541.039
p32212100.873
p33146940.909
p34137041.191
p35162340.974
p36199720.848
p37150900.846
p38134600.874
p39171040.981
p40194340.856
p4189000.482
p4275540.511
p4379490.692
p44121120.51
p4597980.483
p4686840.505
p47134960.638
p48115430.513
p4988820.517
p5094050.529
p5194430.575
p52148540.537
p53130230.579
p54144690.551
p55123280.585
p56310101.606
p57370631.09
p58543851.365
p59435141.107
p60301141.333
p61362811.136
p62502651.142
p63424321.108
p64310571.223
p65370391.114
p66516831.111
p67405811.13
p68303311.543
p69368131.189
p70542531.305
p71412821.107
10044
1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 
5, 7, 8, 2, 9, 9, 5, 9, 3, 2, 6, 3, 0, 0, 6, 9, 5, 0, 3, 9, 7, 6, 3, 5, 6, 9, 5, 7, 0, 3, 3, 8, 2, 0, 3, 7, 9, 3, 6, 8, 5, 7, 8, 2, 5, 7, 0, 2, 5, 6, 

9168
1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 
5, 7, 8, 2, 9, 9, 5, 6, 3, 2, 6, 3, 5, 9, 6, 9, 5, 0, 3, 9, 7, 6, 3, 5, 6, 9, 5, 7, 0, 3, 3, 8, 2, 1, 3, 7, 9, 3, 6, 8, 5, 7, 8, 2, 1, 7, 0, 2, 5, 6, 

10514
1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 
5, 7, 8, 2, 5, 2, 5, 6, 3, 2, 6, 3, 4, 0, 6, 4, 5, 0, 3, 2, 7, 6, 3, 5, 6, 2, 5, 7, 0, 3, 3, 8, 2, 0, 3, 7, 6, 3, 6, 4, 5, 7, 8, 8, 5, 7, 0, 2, 4, 6, 

12079
1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 
5, 7, 0, 2, 5, 2, 5, 6, 3, 2, 6, 6, 4, 0, 6, 4, 5, 0, 3, 2, 7, 6, 3, 5, 6, 2, 5, 7, 0, 3, 3, 0, 2, 0, 3, 7, 6, 3, 6, 4, 5, 7, 0, 2, 5, 7, 0, 2, 4, 6, 

10321
1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 
5, 7, 8, 2, 9, 9, 5, 6, 7, 2, 6, 3, 4, 0, 6, 4, 5, 0, 7, 9, 7, 6, 3, 5, 6, 9, 8, 7, 0, 3, 3, 8, 2, 0, 3, 8, 9, 3, 6, 4, 5, 7, 8, 8, 5, 7, 0, 2, 4, 6, 

9310
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
1, 7, 8, 2, 7, 9, 5, 6, 3, 2, 6, 6, 4, 0, 6, 4, 5, 0, 3, 9, 7, 6, 3, 5, 6, 9, 8, 7, 0, 3, 3, 8, 2, 1, 3, 8, 9, 3, 5, 4, 5, 7, 8, 8, 1, 7, 0, 2, 4, 6, 

10814
1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 
5, 7, 8, 2, 9, 9, 5, 6, 7, 2, 6, 3, 4, 0, 6, 4, 5, 0, 7, 9, 8, 6, 3, 5, 6, 9, 8, 7, 0, 3, 3, 8, 2, 0, 3, 7, 9, 3, 6, 4, 5, 7, 8, 8, 5, 7, 0, 2, 4, 6, 

12682
1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 
5, 7, 8, 2, 7, 2, 5, 6, 7, 2, 6, 6, 4, 0, 6, 4, 5, 0, 3, 9, 7, 6, 3, 9, 8, 9, 5, 7, 0, 3, 3, 8, 2, 0, 3, 7, 9, 3, 6, 4, 5, 7, 8, 8, 5, 7, 0, 2, 4, 6, 

9788
1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 
5, 7, 8, 8, 9, 9, 5, 9, 3, 0, 6, 3, 0, 0, 6, 9, 5, 0, 7, 7, 7, 6, 3, 5, 6, 9, 5, 7, 0, 3, 3, 8, 5, 1, 3, 7, 9, 3, 6, 8, 5, 7, 8, 8, 1, 7, 0, 3, 5, 6, 

8931
1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 
5, 7, 8, 2, 9, 2, 5, 6, 7, 2, 6, 3, 4, 0, 6, 4, 5, 0, 7, 9, 7, 6, 3, 5, 6, 9, 5, 7, 0, 3, 3, 8, 2, 0, 3, 7, 9, 3, 6, 4, 5, 7, 8, 8, 5, 7, 0, 2, 4, 6, 

10348
1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 
5, 7, 8, 2, 7, 2, 5, 6, 3, 2, 6, 3, 0, 0, 6, 6, 5, 0, 3, 7, 7, 6, 3, 5, 6, 2, 5, 7, 0, 3, 3, 8, 2, 0, 3, 7, 6, 3, 6, 8, 5, 7, 8, 8, 5, 7, 0, 2, 0, 6, 

11720
1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 
5, 7, 8, 2, 7, 2, 5, 6, 3, 2, 6, 3, 3, 0, 6, 2, 5, 0, 7, 7, 7, 6, 3, 5, 6, 2, 5, 7, 0, 3, 3, 8, 2, 0, 3, 7, 6, 3, 6, 8, 5, 7, 8, 8, 5, 7, 0, 2, 5, 6, 

9700
1, 1, 0, 0, 1, 1, 1, 0, 1, 0, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 
0, 6, 14, 15, 4, 14, 12, 11, 5, 4, 11, 5, 17, 6, 12, 19, 4, 0, 12, 1, 15, 14, 4, 14, 19, 17, 15, 11, 5, 6, 1, 0, 17, 4, 0, 8, 0, 6, 11, 1, 0, 6, 19, 17, 4, 5, 12, 14, 1, 8, 

8866
1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 
0, 6, 11, 18, 7, 7, 19, 16, 17, 4, 18, 5, 17, 6, 15, 13, 4, 0, 7, 16, 15, 16, 4, 5, 19, 17, 15, 7, 5, 4, 4, 0, 17, 4, 0, 15, 11, 6, 11, 15, 0, 13, 16, 19, 6, 5, 17, 5, 13, 7, 

10384
1, 0, 0, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 
0, 6, 14, 15, 4, 14, 3, 8, 5, 4, 6, 5, 8, 6, 15, 13, 4, 13, 6, 13, 19, 14, 4, 14, 19, 3, 15, 0, 5, 14, 4, 0, 15, 4, 0, 8, 0, 6, 6, 15, 0, 13, 19, 19, 4, 5, 3, 5, 13, 8, 

12345
0, 0, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 1, 
16, 6, 2, 2, 18, 5, 19, 16, 5, 4, 18, 5, 18, 6, 12, 19, 4, 12, 12, 16, 19, 16, 4, 5, 19, 2, 4, 16, 19, 6, 4, 16, 6, 4, 2, 5, 2, 6, 12, 16, 2, 6, 19, 19, 4, 5, 12, 5, 2, 18, 

9332
1, 1, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 
0, 6, 1, 15, 4, 14, 12, 8, 17, 4, 12, 8, 8, 6, 15, 17, 4, 0, 12, 1, 15, 14, 4, 14, 14, 17, 15, 0, 17, 14, 8, 14, 17, 4, 0, 8, 0, 6, 6, 1, 0, 6, 1, 17, 4, 1, 17, 14, 1, 8, 

8452
1, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 
0, 6, 1, 15, 7, 14, 12, 14, 17, 4, 9, 7, 17, 6, 12, 17, 4, 7, 12, 1, 15, 14, 4, 9, 14, 17, 15, 7, 17, 6, 1, 0, 17, 4, 0, 15, 0, 15, 6, 15, 0, 6, 1, 17, 6, 7, 17, 14, 1, 7, 

10415
1, 0, 0, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 
0, 6, 15, 15, 7, 7, 17, 8, 17, 4, 9, 9, 8, 6, 15, 13, 4, 7, 7, 13, 15, 4, 4, 9, 19, 17, 15, 7, 17, 6, 8, 0, 17, 4, 0, 8, 0, 6, 6, 15, 0, 6, 19, 19, 4, 7, 17, 8, 13, 8, 

12884
1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 0, 1, 0, 0, 1, 1, 0, 0, 
0, 6, 1, 17, 7, 7, 17, 8, 17, 6, 11, 7, 17, 11, 11, 13, 11, 7, 7, 1, 1, 16, 0, 7, 6, 13, 11, 7, 17, 6, 1, 0, 17, 13, 0, 8, 0, 6, 11, 1, 0, 13, 16, 17, 6, 7, 17, 8, 1, 8, 

9303
1, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 
0, 6, 1, 17, 4, 14, 17, 8, 17, 4, 9, 9, 8, 6, 13, 13, 4, 0, 0, 1, 6, 14, 4, 9, 14, 17, 4, 0, 17, 4, 1, 8, 17, 4, 0, 8, 0, 6, 6, 1, 0, 6, 1, 17, 6, 4, 17, 14, 13, 8, 

8236
1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 
0, 6, 14, 18, 4, 14, 18, 14, 18, 4, 18, 18, 17, 6, 15, 13, 4, 0, 0, 13, 15, 14, 4, 14, 14, 17, 15, 16, 17, 14, 15, 0, 17, 4, 0, 4, 0, 6, 6, 16, 0, 6, 16, 15, 6, 4, 17, 14, 13, 18, 

10368
1, 0, 0, 0, 1, 1, 1, 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 1, 0, 1, 
0, 6, 14, 15, 6, 14, 19, 8, 5, 4, 4, 5, 17, 6, 15, 13, 4, 13, 0, 13, 19, 14, 4, 14, 19, 17, 15, 0, 5, 6, 4, 0, 17, 4, 0, 8, 0, 6, 6, 13, 0, 13, 19, 19, 4, 5, 17, 15, 13, 8, 

12192
1, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 0, 0, 
0, 2, 14, 2, 4, 14, 12, 16, 17, 4, 12, 7, 17, 12, 12, 17, 4, 7, 12, 16, 15, 16, 4, 14, 14, 17, 15, 7, 17, 14, 15, 0, 17, 4, 0, 15, 0, 15, 12, 15, 0, 2, 16, 17, 4, 7, 17, 14, 2, 7, 

15805
0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 
21, 27, 3, 3, 25, 8, 13, 18, 21, 13, 26, 27, 24, 22, 5, 8, 27, 18, 21, 9, 4, 27, 27, 7, 5, 10, 27, 8, 5, 25, 4, 2, 18, 9, 4, 21, 27, 24, 16, 5, 4, 13, 18, 7, 21, 10, 20, 8, 25, 9, 22, 13, 8, 7, 13, 21, 27, 8, 16, 26, 22, 13, 8, 7, 13, 4, 2, 22, 9, 3, 8, 9, 24, 7, 4, 10, 7, 8, 5, 7, 2, 13, 10, 9, 4, 21, 10, 8, 3, 16, 4, 13, 8, 10, 4, 26, 16, 24, 7, 5, 13, 5, 20, 10, 4, 24, 27, 9, 8, 9, 10, 20, 8, 5, 13, 22, 16, 8, 25, 5, 22, 7, 8, 26, 13, 24, 27, 3, 13, 25, 10, 13, 8, 7, 7, 21, 27, 8, 3, 25, 8, 2, 18, 18, 21, 18, 3, 16, 25, 25, 

12770
0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 
21, 18, 8, 16, 16, 8, 13, 18, 21, 13, 8, 13, 24, 21, 5, 8, 16, 8, 25, 16, 21, 13, 8, 16, 5, 10, 20, 16, 5, 13, 4, 13, 11, 9, 4, 24, 8, 21, 11, 11, 4, 13, 22, 9, 4, 22, 20, 9, 5, 13, 22, 13, 8, 7, 13, 22, 18, 8, 24, 5, 22, 13, 8, 7, 13, 4, 24, 11, 9, 4, 8, 21, 18, 7, 4, 10, 7, 8, 7, 13, 4, 13, 10, 10, 4, 21, 16, 8, 11, 16, 4, 2, 8, 9, 4, 8, 13, 18, 7, 5, 4, 5, 11, 9, 18, 22, 20, 8, 7, 5, 10, 20, 8, 5, 7, 22, 16, 8, 25, 5, 10, 20, 9, 5, 13, 24, 8, 16, 13, 25, 10, 13, 16, 7, 13, 22, 8, 8, 5, 11, 8, 13, 18, 18, 21, 10, 20, 9, 25, 25, 

16471
0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 0, 0, 
10, 27, 21, 25, 20, 8, 13, 18, 7, 13, 8, 8, 18, 21, 16, 21, 13, 8, 25, 16, 21, 27, 24, 16, 16, 22, 20, 8, 8, 2, 11, 13, 11, 9, 1, 21, 8, 8, 25, 8, 8, 13, 10, 10, 24, 10, 20, 16, 25, 7, 22, 13, 8, 7, 13, 22, 8, 8, 13, 25, 10, 13, 8, 7, 9, 11, 24, 11, 10, 1, 20, 22, 18, 21, 13, 22, 7, 8, 7, 7, 11, 13, 10, 10, 1, 21, 27, 24, 2, 16, 8, 2, 8, 10, 1, 22, 27, 8, 7, 16, 13, 13, 11, 9, 1, 22, 27, 8, 8, 9, 10, 20, 16, 25, 13, 22, 8, 8, 25, 13, 7, 20, 8, 7, 13, 1, 18, 16, 25, 25, 22, 13, 16, 7, 7, 24, 27, 8, 25, 25, 8, 13, 18, 18, 1, 24, 20, 9, 8, 11, 

19207
0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 0, 0, 
23, 27, 21, 16, 8, 8, 13, 18, 21, 13, 8, 13, 24, 21, 5, 23, 13, 18, 7, 5, 21, 27, 27, 7, 16, 10, 27, 8, 8, 13, 2, 2, 11, 9, 4, 21, 8, 27, 11, 8, 11, 13, 10, 10, 21, 22, 27, 16, 5, 7, 22, 13, 8, 7, 13, 22, 8, 5, 13, 11, 22, 13, 8, 7, 13, 2, 24, 11, 9, 4, 11, 9, 24, 10, 4, 22, 7, 8, 27, 7, 11, 2, 10, 9, 4, 8, 13, 13, 4, 11, 4, 13, 8, 9, 4, 23, 13, 18, 21, 5, 4, 13, 22, 10, 4, 10, 27, 8, 5, 9, 24, 27, 9, 5, 13, 22, 8, 8, 7, 5, 27, 7, 8, 5, 13, 24, 18, 8, 24, 11, 22, 13, 8, 7, 7, 22, 18, 8, 8, 11, 8, 13, 18, 21, 21, 22, 27, 8, 5, 13, 

16055
0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 0, 0, 
21, 10, 8, 16, 20, 8, 13, 18, 21, 13, 14, 13, 24, 21, 5, 22, 8, 8, 21, 5, 21, 16, 27, 25, 16, 24, 20, 8, 25, 27, 2, 24, 11, 9, 4, 22, 27, 21, 25, 11, 25, 24, 10, 9, 21, 7, 27, 16, 5, 7, 22, 13, 8, 7, 13, 21, 27, 5, 13, 25, 22, 13, 8, 7, 13, 2, 13, 20, 9, 4, 11, 13, 18, 21, 14, 10, 7, 16, 27, 13, 11, 13, 10, 7, 14, 14, 10, 24, 21, 11, 4, 2, 8, 10, 4, 14, 16, 24, 21, 5, 4, 13, 11, 10, 4, 24, 20, 16, 7, 5, 22, 20, 9, 25, 9, 22, 27, 8, 25, 9, 22, 27, 8, 5, 9, 21, 18, 24, 8, 11, 22, 13, 16, 7, 7, 22, 27, 8, 8, 25, 8, 21, 18, 7, 14, 10, 16, 9, 7, 9, 

14292
0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 
21, 18, 8, 3, 20, 8, 13, 18, 9, 1, 26, 13, 27, 22, 4, 22, 13, 8, 7, 5, 21, 20, 24, 25, 5, 5, 20, 8, 5, 9, 4, 2, 11, 10, 4, 22, 27, 21, 25, 11, 8, 13, 10, 9, 21, 10, 20, 8, 5, 7, 22, 13, 8, 7, 13, 10, 3, 8, 13, 26, 22, 13, 8, 7, 9, 11, 13, 10, 9, 4, 8, 22, 18, 9, 4, 22, 7, 16, 7, 7, 4, 2, 10, 10, 4, 21, 10, 27, 2, 16, 4, 13, 10, 9, 4, 26, 21, 24, 21, 16, 4, 24, 11, 10, 3, 10, 20, 8, 8, 13, 10, 13, 16, 5, 7, 22, 27, 8, 25, 5, 10, 27, 8, 26, 7, 18, 27, 3, 3, 2, 10, 13, 16, 7, 7, 22, 20, 3, 5, 16, 11, 21, 18, 18, 21, 10, 27, 16, 5, 2, 

17354
0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 0, 0, 
21, 10, 7, 7, 20, 8, 13, 18, 7, 1, 8, 21, 8, 21, 16, 22, 27, 18, 9, 9, 21, 16, 27, 25, 5, 22, 20, 16, 5, 6, 2, 2, 10, 7, 4, 21, 16, 27, 2, 16, 4, 13, 10, 21, 1, 22, 20, 9, 5, 7, 10, 13, 8, 7, 13, 24, 27, 9, 24, 5, 22, 13, 8, 7, 9, 2, 13, 22, 9, 4, 8, 21, 18, 21, 1, 10, 7, 8, 27, 7, 4, 13, 10, 9, 4, 22, 27, 25, 16, 5, 4, 2, 8, 10, 4, 6, 27, 24, 21, 9, 2, 13, 22, 9, 4, 10, 20, 8, 25, 13, 22, 20, 9, 5, 7, 22, 27, 8, 7, 13, 24, 20, 6, 25, 7, 21, 27, 5, 13, 2, 10, 13, 9, 7, 7, 22, 18, 8, 8, 25, 2, 21, 18, 10, 4, 10, 27, 8, 25, 25, 

21210
0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 
21, 10, 7, 25, 2, 8, 13, 18, 9, 13, 8, 16, 8, 7, 5, 8, 16, 18, 7, 5, 11, 27, 27, 7, 5, 10, 20, 9, 5, 25, 4, 2, 10, 9, 13, 24, 16, 21, 21, 16, 11, 13, 18, 10, 4, 7, 7, 16, 5, 13, 10, 13, 8, 7, 9, 21, 8, 3, 3, 25, 10, 13, 8, 7, 13, 4, 24, 11, 10, 4, 20, 16, 18, 9, 21, 24, 20, 16, 5, 13, 11, 13, 10, 10, 4, 21, 27, 18, 16, 11, 8, 13, 8, 10, 4, 21, 8, 24, 21, 16, 11, 4, 11, 10, 4, 24, 27, 18, 25, 13, 10, 20, 9, 5, 7, 24, 27, 8, 7, 9, 27, 3, 8, 5, 13, 24, 27, 8, 25, 2, 10, 16, 8, 7, 7, 21, 16, 16, 3, 25, 4, 21, 18, 21, 21, 10, 20, 9, 25, 9, 

14694
1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 
22, 10, 7, 25, 16, 8, 13, 18, 21, 13, 21, 21, 24, 25, 16, 22, 13, 18, 25, 16, 21, 16, 24, 25, 16, 24, 0, 8, 7, 6, 4, 2, 10, 9, 4, 21, 0, 8, 25, 8, 25, 2, 18, 9, 24, 10, 0, 16, 25, 13, 22, 13, 8, 7, 13, 22, 0, 8, 24, 2, 10, 13, 8, 7, 13, 2, 13, 22, 9, 4, 4, 13, 18, 21, 9, 10, 7, 16, 7, 7, 4, 2, 10, 10, 4, 21, 10, 25, 7, 16, 4, 13, 8, 10, 4, 21, 13, 18, 21, 16, 4, 24, 2, 9, 4, 22, 8, 8, 7, 9, 10, 0, 6, 25, 13, 22, 13, 8, 7, 9, 24, 0, 6, 25, 7, 10, 18, 9, 8, 25, 10, 13, 16, 7, 7, 22, 18, 8, 25, 25, 8, 13, 18, 21, 4, 22, 16, 8, 25, 9, 

13704
0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 1, 
22, 28, 7, 16, 11, 8, 21, 18, 21, 9, 21, 21, 18, 22, 11, 14, 16, 8, 7, 5, 21, 8, 27, 25, 5, 22, 28, 16, 5, 9, 2, 2, 11, 9, 4, 21, 28, 21, 25, 5, 8, 13, 10, 10, 4, 22, 27, 8, 5, 9, 22, 13, 8, 7, 13, 21, 18, 16, 7, 2, 22, 13, 8, 7, 13, 2, 13, 22, 10, 4, 14, 13, 18, 7, 4, 29, 7, 8, 25, 7, 11, 13, 10, 7, 4, 21, 28, 21, 7, 9, 2, 13, 8, 9, 4, 8, 21, 8, 7, 4, 4, 4, 28, 10, 4, 22, 27, 8, 25, 5, 29, 27, 16, 5, 13, 10, 27, 8, 7, 5, 28, 7, 9, 7, 7, 22, 18, 8, 7, 25, 10, 13, 8, 7, 7, 22, 28, 8, 8, 25, 11, 13, 18, 18, 4, 10, 27, 29, 5, 13, 

16234
1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 1, 0, 0, 
22, 10, 8, 11, 11, 8, 13, 8, 21, 1, 21, 13, 24, 0, 5, 22, 16, 8, 25, 5, 21, 16, 27, 7, 5, 10, 27, 8, 5, 27, 4, 13, 11, 9, 4, 21, 27, 27, 7, 16, 4, 21, 10, 10, 24, 7, 0, 8, 7, 7, 10, 13, 8, 7, 13, 24, 0, 8, 25, 11, 22, 13, 8, 7, 9, 11, 13, 10, 10, 1, 8, 13, 24, 21, 16, 24, 7, 16, 7, 9, 4, 13, 10, 7, 4, 21, 13, 27, 4, 16, 4, 13, 8, 9, 4, 8, 13, 24, 7, 5, 4, 24, 11, 9, 4, 22, 16, 8, 8, 13, 22, 0, 16, 5, 7, 10, 16, 8, 7, 5, 7, 7, 8, 1, 9, 10, 27, 8, 13, 25, 10, 13, 16, 7, 7, 10, 0, 8, 7, 11, 11, 13, 10, 10, 1, 10, 0, 8, 5, 25, 

19972
0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0, 0, 1, 0, 0, 0, 1, 
21, 10, 7, 7, 8, 8, 13, 18, 7, 1, 20, 21, 8, 21, 16, 14, 16, 8, 7, 13, 21, 20, 8, 25, 16, 10, 20, 29, 8, 25, 2, 13, 11, 7, 1, 21, 16, 21, 2, 16, 25, 13, 11, 7, 14, 10, 20, 16, 25, 9, 22, 13, 8, 7, 13, 21, 18, 8, 25, 25, 22, 13, 8, 7, 9, 8, 2, 11, 7, 21, 20, 21, 18, 7, 14, 10, 7, 8, 7, 7, 11, 13, 10, 10, 1, 8, 8, 8, 2, 16, 2, 13, 8, 9, 13, 8, 16, 18, 14, 9, 25, 2, 11, 10, 1, 10, 16, 9, 8, 9, 29, 20, 16, 25, 13, 10, 16, 8, 7, 9, 22, 16, 16, 7, 13, 18, 20, 29, 8, 25, 10, 13, 8, 7, 7, 21, 18, 8, 25, 25, 2, 21, 18, 10, 14, 10, 20, 16, 7, 11, 

15090
0, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 0, 1, 0, 0, 
21, 18, 8, 11, 5, 8, 13, 18, 21, 1, 20, 13, 24, 7, 5, 22, 27, 8, 7, 5, 21, 27, 27, 7, 16, 22, 27, 8, 13, 27, 4, 13, 11, 7, 1, 21, 27, 27, 11, 5, 8, 13, 15, 9, 4, 10, 20, 8, 5, 7, 10, 13, 8, 7, 13, 22, 20, 8, 15, 5, 22, 13, 8, 7, 9, 11, 13, 10, 9, 4, 11, 22, 18, 21, 4, 24, 7, 16, 7, 7, 11, 13, 10, 9, 1, 21, 10, 21, 16, 5, 8, 13, 8, 10, 4, 21, 27, 24, 7, 5, 11, 5, 22, 9, 1, 22, 27, 8, 8, 5, 22, 20, 16, 7, 13, 22, 16, 8, 7, 5, 27, 20, 9, 5, 13, 10, 8, 8, 5, 8, 10, 13, 16, 7, 7, 21, 20, 8, 8, 5, 8, 21, 18, 9, 4, 10, 20, 8, 15, 13, 

13460
0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 1, 
21, 18, 9, 7, 8, 8, 13, 18, 7, 1, 21, 13, 8, 11, 5, 22, 13, 8, 7, 5, 21, 16, 27, 7, 9, 10, 18, 9, 8, 7, 4, 13, 11, 9, 4, 21, 27, 27, 16, 8, 2, 27, 10, 9, 21, 10, 7, 16, 5, 9, 22, 13, 8, 7, 13, 21, 18, 29, 13, 16, 22, 13, 8, 7, 13, 4, 2, 22, 9, 4, 8, 13, 18, 21, 1, 10, 7, 16, 7, 7, 11, 13, 10, 9, 4, 21, 27, 27, 2, 5, 4, 13, 8, 9, 4, 21, 13, 18, 7, 5, 11, 13, 11, 7, 1, 22, 27, 8, 8, 5, 10, 7, 8, 5, 7, 22, 27, 8, 7, 5, 27, 20, 9, 29, 13, 10, 16, 8, 13, 9, 10, 13, 8, 7, 13, 21, 18, 8, 7, 9, 4, 13, 10, 10, 1, 10, 20, 29, 7, 9, 

17104
1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 1, 0, 1, 1, 0, 1, 0, 0, 
21, 10, 24, 2, 11, 8, 13, 18, 21, 13, 8, 16, 24, 22, 5, 21, 16, 18, 9, 16, 21, 27, 8, 7, 16, 5, 0, 8, 5, 2, 4, 13, 11, 9, 4, 21, 27, 8, 11, 25, 4, 13, 18, 9, 1, 7, 27, 8, 5, 7, 22, 13, 8, 7, 13, 21, 1, 8, 25, 25, 22, 13, 8, 7, 13, 2, 24, 22, 9, 1, 8, 13, 18, 21, 4, 10, 7, 16, 25, 7, 11, 2, 10, 9, 4, 21, 13, 25, 4, 11, 4, 13, 8, 10, 4, 8, 13, 18, 7, 1, 2, 13, 22, 10, 1, 24, 0, 8, 25, 5, 10, 0, 8, 5, 7, 22, 27, 8, 7, 13, 7, 7, 9, 5, 7, 22, 18, 8, 13, 2, 10, 13, 8, 7, 13, 21, 8, 8, 8, 25, 11, 13, 18, 18, 1, 18, 0, 8, 5, 7, 

19434
0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1, 0, 0, 
21, 16, 7, 11, 2, 8, 13, 18, 21, 13, 8, 13, 24, 21, 16, 8, 16, 8, 7, 5, 21, 16, 8, 7, 5, 22, 1, 8, 7, 5, 2, 24, 11, 9, 4, 21, 27, 21, 16, 5, 11, 2, 18, 9, 4, 24, 27, 8, 5, 13, 22, 13, 8, 7, 13, 21, 27, 5, 8, 11, 22, 13, 8, 7, 9, 4, 13, 22, 9, 4, 8, 22, 18, 18, 1, 10, 7, 16, 5, 7, 2, 13, 10, 9, 4, 8, 13, 21, 2, 16, 2, 13, 8, 10, 4, 24, 16, 18, 2, 5, 2, 13, 22, 9, 21, 24, 27, 8, 8, 5, 22, 27, 16, 5, 9, 22, 27, 8, 7, 5, 27, 27, 1, 5, 13, 24, 1, 16, 13, 11, 22, 13, 8, 7, 7, 10, 27, 8, 8, 11, 8, 21, 18, 7, 21, 10, 27, 8, 7, 9, 

8900
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
0, 8, 7, 3, 6, 8, 4, 3, 0, 3, 9, 3, 7, 9, 1, 7, 2, 6, 4, 2, 5, 5, 0, 6, 6, 6, 2, 6, 7, 9, 4, 3, 7, 3, 4, 0, 2, 0, 2, 1, 9, 0, 9, 2, 3, 0, 6, 9, 1, 5, 7, 3, 9, 0, 1, 9, 0, 7, 8, 1, 5, 2, 6, 4, 6, 5, 5, 1, 5, 3, 4, 0, 8, 8, 8, 0, 6, 8, 3, 9, 0, 5, 1, 5, 5, 0, 4, 7, 6, 5, 

7554
0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 
6, 19, 8, 6, 6, 19, 10, 6, 8, 8, 16, 1, 2, 4, 1, 1, 2, 6, 1, 2, 19, 2, 19, 10, 4, 11, 6, 19, 6, 10, 10, 6, 11, 4, 6, 10, 19, 2, 4, 4, 1, 11, 6, 10, 2, 6, 4, 4, 8, 4, 16, 11, 2, 8, 2, 2, 19, 16, 19, 4, 4, 11, 8, 16, 6, 4, 10, 6, 6, 8, 10, 6, 11, 11, 6, 16, 4, 11, 8, 19, 

7949
1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 
19, 21, 18, 6, 18, 21, 18, 12, 15, 19, 8, 29, 0, 19, 15, 24, 21, 17, 12, 6, 17, 6, 21, 19, 10, 10, 29, 14, 14, 21, 6, 12, 8, 15, 18, 17, 19, 14, 0, 21, 14, 8, 14, 24, 17, 15, 21, 12, 10, 14, 8, 15, 15, 24, 0, 18, 10, 14, 14, 0, 8, 10, 6, 8, 12, 6, 24, 18, 0, 24, 

12112
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
9, 5, 1, 6, 1, 2, 4, 3, 7, 8, 6, 0, 0, 3, 6, 7, 4, 4, 5, 7, 8, 0, 4, 4, 7, 5, 4, 0, 1, 6, 4, 8, 3, 3, 2, 5, 4, 5, 1, 7, 0, 2, 1, 0, 9, 5, 1, 1, 6, 7, 2, 0, 8, 9, 8, 2, 2, 6, 6, 1, 5, 7, 6, 9, 9, 1, 6, 6, 7, 0, 4, 0, 8, 7, 9, 0, 5, 5, 7, 5, 4, 5, 7, 7, 6, 9, 4, 2, 2, 3, 

9798
1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 
5, 18, 8, 10, 10, 18, 18, 19, 18, 0, 0, 5, 16, 0, 0, 5, 16, 3, 3, 16, 0, 12, 16, 14, 12, 18, 8, 10, 10, 0, 18, 19, 19, 8, 3, 16, 18, 0, 19, 18, 10, 0, 18, 18, 19, 8, 12, 16, 16, 5, 3, 0, 8, 0, 14, 12, 19, 12, 16, 14, 14, 19, 8, 10, 5, 14, 5, 3, 19, 5, 12, 3, 14, 18, 14, 10, 5, 18, 10, 10, 

8684
1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 0, 1, 0, 0, 
5, 20, 21, 19, 3, 5, 5, 19, 5, 0, 3, 5, 13, 19, 21, 21, 5, 8, 20, 19, 12, 27, 3, 12, 20, 27, 3, 21, 8, 27, 0, 27, 5, 27, 5, 13, 12, 8, 20, 0, 27, 25, 19, 27, 3, 21, 19, 8, 20, 20, 12, 19, 19, 3, 3, 13, 25, 8, 5, 5, 27, 27, 25, 25, 21, 5, 20, 12, 21, 8, 

13496
1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 
4, 8, 2, 8, 1, 9, 7, 9, 8, 7, 6, 4, 1, 6, 7, 7, 9, 9, 6, 7, 2, 8, 6, 7, 7, 7, 0, 8, 7, 8, 2, 6, 2, 0, 9, 1, 8, 7, 1, 7, 0, 6, 1, 9, 0, 2, 7, 7, 5, 7, 2, 4, 1, 0, 2, 7, 0, 5, 1, 4, 4, 7, 0, 5, 7, 0, 6, 7, 4, 5, 0, 0, 2, 9, 0, 6, 6, 5, 6, 7, 0, 1, 2, 2, 6, 6, 5, 7, 6, 5, 

11543
1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 
5, 3, 8, 0, 5, 3, 12, 0, 12, 3, 12, 19, 13, 3, 0, 0, 17, 0, 12, 17, 18, 3, 0, 0, 18, 5, 0, 0, 19, 8, 0, 0, 18, 12, 13, 0, 18, 19, 0, 0, 18, 18, 5, 3, 18, 17, 3, 8, 3, 13, 17, 8, 16, 12, 12, 8, 5, 16, 18, 3, 3, 16, 18, 3, 3, 13, 19, 5, 3, 19, 19, 8, 0, 13, 19, 13, 3, 13, 12, 17, 

8882
1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 1, 
0, 29, 11, 23, 23, 5, 28, 11, 5, 18, 2, 29, 2, 29, 16, 5, 29, 0, 2, 23, 0, 23, 5, 28, 2, 29, 16, 5, 29, 0, 23, 11, 23, 23, 5, 28, 5, 2, 16, 23, 28, 0, 28, 21, 2, 23, 11, 18, 2, 2, 23, 2, 28, 0, 18, 16, 0, 28, 2, 23, 11, 5, 21, 0, 29, 5, 23, 16, 0, 29, 

9405
1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 
3, 1, 0, 9, 0, 5, 8, 2, 6, 1, 5, 2, 6, 6, 1, 2, 8, 2, 8, 1, 5, 7, 6, 6, 5, 9, 8, 5, 2, 5, 0, 1, 7, 2, 9, 0, 8, 7, 0, 3, 2, 1, 7, 2, 9, 2, 7, 5, 7, 5, 6, 7, 6, 5, 6, 1, 8, 5, 2, 5, 1, 2, 0, 9, 0, 2, 7, 2, 8, 1, 0, 7, 6, 0, 9, 1, 8, 5, 9, 5, 5, 7, 6, 9, 7, 2, 8, 5, 7, 8, 5, 5, 6, 6, 3, 7, 0, 2, 8, 0, 

9443
1, 1, 0, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 
1, 19, 17, 13, 16, 0, 7, 11, 8, 8, 5, 7, 11, 1, 1, 0, 5, 12, 19, 8, 5, 19, 17, 0, 13, 0, 15, 11, 8, 7, 1, 19, 12, 13, 11, 0, 7, 17, 15, 7, 17, 7, 11, 8, 7, 0, 5, 11, 15, 8, 1, 19, 15, 13, 8, 5, 7, 17, 15, 13, 5, 16, 19, 0, 15, 5, 16, 19, 0, 11, 11, 5, 12, 19, 11, 19, 7, 12, 8, 0, 7, 7, 12, 8, 1, 0, 12, 12, 16, 0, 5, 16, 19, 0, 11, 11, 13, 12, 17, 0, 

14854
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
5, 3, 3, 8, 6, 2, 4, 9, 1, 0, 5, 3, 3, 6, 0, 3, 6, 0, 0, 2, 5, 3, 3, 8, 5, 4, 7, 9, 7, 7, 8, 2, 3, 2, 6, 2, 4, 3, 1, 7, 9, 3, 3, 8, 6, 2, 4, 2, 7, 7, 8, 9, 3, 2, 9, 5, 1, 9, 4, 4, 2, 1, 3, 6, 1, 3, 0, 1, 0, 2, 7, 3, 3, 6, 4, 4, 7, 2, 7, 7, 8, 9, 3, 2, 8, 5, 3, 3, 2, 0, 5, 9, 9, 1, 9, 5, 6, 9, 4, 2, 

13023
1, 1, 1, 1, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0, 1, 0, 0, 1, 1, 
19, 3, 15, 19, 9, 13, 3, 11, 13, 18, 19, 11, 15, 1, 11, 19, 3, 11, 13, 18, 8, 3, 11, 19, 18, 5, 18, 5, 8, 0, 11, 3, 12, 8, 19, 13, 3, 12, 8, 9, 19, 3, 15, 19, 11, 19, 11, 13, 1, 12, 5, 18, 12, 8, 9, 19, 3, 15, 3, 9, 19, 3, 11, 5, 9, 19, 3, 15, 5, 2, 1, 18, 13, 19, 0, 19, 3, 15, 2, 11, 5, 18, 13, 8, 19, 5, 18, 13, 19, 0, 0, 18, 1, 0, 0, 13, 3, 12, 8, 9, 

14469
1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 
4, 2, 0, 9, 2, 4, 4, 6, 2, 0, 4, 0, 3, 3, 6, 1, 6, 4, 8, 0, 4, 6, 2, 3, 2, 1, 4, 4, 8, 0, 4, 6, 8, 4, 8, 1, 6, 4, 8, 0, 4, 0, 2, 9, 2, 4, 4, 4, 5, 0, 4, 9, 3, 3, 2, 4, 4, 3, 9, 0, 4, 9, 3, 9, 2, 4, 8, 3, 8, 5, 3, 0, 2, 3, 2, 1, 4, 4, 9, 0, 2, 9, 3, 3, 6, 0, 6, 1, 9, 0, 2, 0, 2, 9, 2, 1, 6, 4, 5, 5, 

12328
1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 
19, 3, 9, 6, 10, 19, 0, 0, 6, 9, 10, 5, 2, 14, 8, 19, 2, 0, 4, 9, 3, 2, 2, 14, 10, 4, 2, 2, 6, 10, 19, 6, 6, 6, 9, 19, 19, 0, 5, 5, 9, 5, 2, 14, 10, 4, 19, 0, 4, 2, 19, 19, 0, 5, 9, 19, 19, 0, 4, 9, 19, 6, 6, 6, 10, 19, 19, 0, 4, 5, 19, 5, 8, 4, 9, 2, 0, 2, 4, 10, 2, 2, 6, 14, 10, 4, 2, 2, 14, 19, 3, 2, 2, 6, 8, 19, 19, 2, 6, 9, 

31010
1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 
26, 22, 1, 8, 26, 3, 8, 3, 14, 5, 9, 28, 0, 12, 27, 16, 14, 21, 5, 5, 16, 16, 15, 5, 17, 8, 7, 22, 3, 16, 4, 12, 7, 14, 2, 16, 7, 16, 26, 27, 1, 18, 12, 7, 22, 22, 12, 5, 19, 19, 3, 14, 5, 27, 17, 28, 5, 9, 14, 15, 17, 27, 13, 14, 0, 27, 5, 14, 9, 15, 15, 3, 17, 15, 14, 15, 12, 22, 3, 16, 5, 12, 5, 12, 23, 22, 15, 2, 14, 5, 9, 29, 0, 21, 29, 26, 19, 0, 11, 9, 23, 9, 19, 11, 27, 7, 17, 23, 13, 9, 8, 1, 29, 21, 7, 18, 18, 19, 11, 18, 15, 28, 29, 13, 28, 15, 21, 4, 8, 2, 23, 8, 12, 9, 16, 13, 5, 23, 19, 1, 2, 17, 27, 17, 5, 7, 1, 8, 11, 18, 8, 11, 5, 27, 4, 27, 5, 29, 12, 17, 23, 21, 28, 18, 11, 0, 2, 15, 29, 23, 2, 13, 26, 5, 23, 17, 4, 18, 27, 1, 7, 4, 28, 22, 28, 15, 8, 1, 8, 26, 0, 8, 12, 9, 12, 22, 26, 1, 27, 8, 

37063
1, 0, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
0, 4, 6, 15, 9, 26, 10, 3, 6, 15, 9, 29, 27, 14, 27, 27, 14, 21, 5, 5, 12, 16, 3, 19, 17, 9, 25, 22, 5, 14, 4, 5, 7, 3, 4, 25, 7, 29, 24, 5, 14, 12, 26, 7, 3, 22, 12, 15, 22, 0, 17, 14, 24, 4, 21, 4, 0, 5, 14, 15, 17, 11, 22, 25, 15, 21, 5, 14, 9, 10, 29, 3, 17, 15, 14, 6, 12, 11, 3, 14, 5, 25, 11, 7, 7, 5, 12, 3, 24, 15, 9, 29, 27, 24, 16, 17, 14, 23, 22, 3, 6, 23, 19, 11, 27, 19, 26, 11, 11, 9, 25, 17, 29, 19, 7, 11, 10, 19, 11, 6, 0, 10, 28, 3, 10, 11, 21, 21, 5, 21, 23, 10, 12, 27, 16, 26, 5, 29, 22, 9, 4, 17, 19, 11, 11, 19, 11, 11, 11, 0, 7, 11, 5, 27, 4, 25, 0, 24, 22, 17, 23, 22, 28, 17, 11, 0, 9, 5, 29, 23, 17, 14, 24, 4, 23, 10, 24, 14, 27, 4, 26, 4, 28, 22, 28, 11, 29, 4, 28, 29, 16, 25, 23, 9, 23, 10, 4, 0, 27, 23, 

54385
1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 
23, 17, 21, 28, 11, 1, 8, 6, 6, 5, 9, 6, 8, 14, 9, 2, 7, 16, 29, 20, 16, 14, 20, 5, 17, 10, 7, 0, 20, 21, 11, 10, 14, 9, 2, 16, 7, 16, 24, 0, 1, 18, 11, 1, 22, 22, 19, 5, 0, 0, 17, 19, 24, 6, 17, 28, 29, 9, 14, 1, 17, 27, 18, 29, 0, 21, 5, 2, 24, 10, 29, 9, 19, 8, 0, 19, 22, 17, 0, 16, 5, 5, 11, 23, 20, 5, 6, 2, 24, 6, 19, 29, 17, 11, 29, 17, 2, 8, 22, 9, 6, 17, 27, 11, 5, 7, 17, 11, 11, 9, 7, 1, 22, 21, 29, 18, 1, 8, 11, 9, 0, 28, 28, 27, 1, 11, 21, 21, 5, 2, 23, 8, 14, 27, 16, 16, 0, 10, 14, 1, 2, 22, 1, 17, 5, 19, 11, 8, 18, 18, 7, 11, 5, 22, 2, 24, 0, 24, 24, 17, 23, 20, 28, 17, 11, 0, 9, 5, 19, 22, 2, 2, 24, 20, 23, 7, 2, 14, 27, 29, 26, 20, 28, 22, 21, 11, 29, 1, 16, 20, 16, 8, 28, 9, 8, 10, 26, 1, 27, 8, 

43514
1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 
0, 20, 14, 15, 9, 3, 8, 6, 24, 7, 9, 29, 8, 12, 3, 2, 14, 16, 23, 20, 16, 16, 15, 19, 17, 8, 7, 22, 20, 16, 6, 10, 14, 14, 2, 16, 14, 24, 24, 10, 1, 12, 12, 1, 20, 28, 3, 10, 22, 19, 3, 14, 23, 4, 24, 13, 29, 9, 19, 1, 17, 27, 13, 25, 15, 21, 7, 2, 9, 7, 0, 9, 17, 8, 20, 6, 13, 17, 0, 14, 1, 12, 12, 7, 12, 22, 4, 2, 24, 15, 9, 24, 27, 8, 29, 17, 19, 29, 22, 3, 2, 9, 27, 17, 27, 7, 1, 23, 13, 9, 25, 20, 22, 21, 7, 17, 10, 8, 15, 29, 0, 10, 10, 13, 28, 15, 21, 1, 8, 2, 23, 12, 12, 2, 16, 13, 0, 25, 14, 1, 2, 17, 6, 4, 6, 19, 2, 8, 7, 9, 8, 20, 29, 22, 4, 24, 0, 24, 12, 17, 23, 8, 19, 17, 21, 0, 9, 10, 25, 22, 17, 14, 24, 20, 25, 10, 2, 14, 27, 4, 3, 20, 28, 22, 28, 0, 29, 1, 28, 29, 16, 8, 28, 9, 8, 10, 4, 1, 27, 8, 

30114
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 
0, 20, 21, 15, 9, 3, 10, 3, 6, 5, 9, 7, 0, 14, 9, 2, 7, 16, 16, 20, 12, 16, 4, 19, 17, 8, 5, 22, 20, 14, 4, 10, 7, 2, 2, 27, 14, 29, 5, 10, 1, 0, 12, 1, 22, 5, 12, 5, 22, 19, 17, 19, 23, 6, 17, 4, 5, 5, 19, 15, 17, 27, 22, 29, 15, 23, 5, 14, 9, 5, 19, 3, 19, 8, 22, 15, 17, 17, 15, 16, 5, 25, 11, 23, 7, 5, 15, 2, 6, 15, 9, 29, 27, 27, 29, 17, 2, 0, 22, 3, 6, 17, 19, 11, 27, 7, 17, 23, 7, 9, 25, 17, 9, 19, 7, 11, 19, 8, 11, 28, 0, 10, 29, 27, 28, 5, 21, 21, 8, 16, 28, 25, 12, 27, 21, 28, 0, 5, 14, 1, 4, 22, 27, 4, 6, 19, 1, 8, 11, 9, 8, 11, 1, 22, 2, 25, 5, 29, 12, 1, 19, 20, 19, 17, 11, 0, 10, 25, 29, 23, 27, 19, 23, 20, 12, 7, 2, 14, 27, 29, 3, 4, 28, 22, 28, 15, 29, 9, 28, 29, 27, 8, 23, 11, 8, 10, 4, 1, 27, 4, 

36281
0, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 
23, 8, 1, 15, 18, 25, 8, 3, 26, 25, 26, 22, 27, 14, 2, 2, 14, 16, 16, 12, 12, 16, 25, 5, 17, 10, 7, 21, 5, 14, 23, 5, 7, 14, 2, 25, 7, 8, 26, 17, 1, 12, 12, 1, 3, 22, 12, 5, 22, 22, 17, 14, 5, 4, 17, 4, 5, 5, 14, 15, 17, 27, 18, 29, 15, 4, 5, 14, 23, 15, 18, 3, 2, 8, 22, 15, 16, 11, 3, 14, 5, 25, 11, 23, 12, 5, 15, 2, 4, 5, 15, 29, 2, 21, 29, 28, 2, 10, 11, 3, 29, 3, 27, 11, 27, 7, 11, 23, 12, 18, 25, 16, 21, 29, 7, 11, 18, 12, 11, 7, 15, 28, 28, 27, 28, 15, 21, 17, 8, 2, 23, 23, 12, 27, 16, 26, 2, 29, 22, 28, 2, 17, 1, 11, 5, 7, 28, 8, 11, 18, 8, 11, 3, 22, 2, 25, 14, 23, 12, 17, 3, 8, 28, 17, 11, 26, 2, 5, 29, 23, 17, 14, 23, 5, 12, 23, 2, 18, 27, 4, 26, 4, 28, 22, 28, 11, 29, 4, 28, 29, 22, 8, 26, 2, 8, 10, 4, 1, 27, 8, 

50265
1, 0, 1, 1, 0, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 
19, 20, 21, 8, 9, 0, 10, 3, 26, 5, 9, 28, 8, 16, 9, 2, 27, 16, 16, 20, 16, 16, 25, 19, 17, 18, 5, 22, 20, 21, 23, 8, 18, 3, 2, 27, 0, 16, 26, 10, 5, 5, 26, 10, 20, 5, 20, 5, 22, 0, 17, 2, 26, 27, 26, 26, 5, 5, 19, 28, 17, 27, 3, 25, 0, 21, 5, 2, 21, 10, 29, 3, 2, 8, 5, 19, 10, 22, 3, 22, 5, 29, 5, 23, 20, 5, 3, 3, 23, 10, 19, 29, 17, 27, 29, 18, 19, 10, 22, 3, 29, 9, 19, 11, 27, 19, 17, 11, 11, 9, 25, 20, 29, 19, 29, 11, 20, 8, 11, 2, 0, 10, 10, 2, 28, 5, 21, 20, 8, 21, 10, 8, 23, 27, 16, 26, 5, 9, 18, 28, 2, 17, 19, 11, 26, 19, 11, 8, 18, 18, 8, 11, 5, 22, 2, 25, 0, 29, 22, 9, 19, 20, 19, 17, 26, 0, 2, 5, 25, 22, 21, 19, 26, 20, 23, 10, 2, 18, 27, 29, 19, 20, 28, 22, 28, 11, 29, 17, 28, 29, 16, 8, 26, 20, 8, 10, 26, 18, 27, 8, 

42432
1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
9, 20, 21, 0, 9, 26, 8, 6, 6, 25, 9, 22, 17, 14, 27, 11, 25, 16, 16, 20, 13, 16, 25, 19, 17, 9, 21, 20, 20, 16, 6, 12, 14, 14, 2, 16, 14, 24, 24, 20, 1, 12, 12, 23, 20, 22, 12, 10, 19, 19, 14, 13, 1, 4, 17, 4, 2, 9, 14, 1, 17, 11, 13, 29, 0, 4, 19, 2, 9, 10, 29, 22, 17, 8, 14, 9, 16, 22, 9, 14, 1, 12, 11, 24, 20, 22, 6, 2, 14, 10, 9, 29, 27, 8, 29, 17, 20, 29, 11, 9, 29, 17, 6, 11, 27, 19, 11, 23, 11, 9, 25, 1, 21, 0, 29, 17, 10, 8, 11, 2, 25, 10, 29, 22, 28, 11, 21, 21, 8, 21, 23, 8, 23, 9, 16, 26, 2, 23, 12, 1, 4, 17, 27, 11, 6, 19, 11, 8, 11, 9, 8, 11, 1, 22, 4, 24, 0, 23, 12, 17, 23, 17, 19, 17, 11, 0, 2, 1, 19, 23, 17, 13, 24, 20, 25, 23, 2, 10, 27, 4, 25, 4, 28, 6, 1, 0, 29, 1, 28, 29, 21, 0, 23, 20, 8, 10, 4, 1, 27, 8, 

31057
1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 
0, 20, 1, 15, 11, 1, 8, 3, 6, 5, 15, 29, 0, 14, 27, 2, 14, 16, 16, 5, 16, 16, 4, 19, 17, 10, 21, 0, 20, 16, 4, 10, 14, 3, 2, 27, 14, 24, 24, 10, 1, 25, 8, 1, 20, 17, 20, 5, 19, 23, 21, 14, 24, 4, 16, 4, 5, 9, 14, 1, 17, 11, 13, 25, 4, 24, 5, 14, 9, 10, 18, 9, 19, 8, 5, 15, 13, 11, 3, 14, 5, 5, 9, 23, 20, 5, 4, 14, 24, 15, 9, 24, 0, 27, 16, 17, 2, 8, 13, 3, 6, 17, 27, 11, 27, 19, 1, 23, 29, 9, 26, 1, 3, 1, 16, 17, 18, 19, 11, 6, 20, 10, 10, 2, 21, 11, 21, 17, 8, 2, 10, 8, 23, 9, 16, 26, 0, 23, 19, 3, 2, 23, 27, 11, 6, 19, 11, 8, 16, 9, 8, 11, 1, 23, 4, 25, 0, 24, 20, 0, 21, 8, 1, 17, 26, 0, 2, 15, 19, 23, 2, 19, 26, 11, 21, 10, 2, 18, 27, 4, 3, 4, 28, 17, 28, 0, 29, 1, 27, 29, 0, 0, 26, 20, 8, 10, 4, 1, 27, 8, 

37039
0, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
19, 8, 6, 15, 25, 26, 8, 3, 6, 5, 19, 4, 8, 12, 27, 2, 14, 21, 23, 19, 17, 24, 25, 19, 17, 4, 5, 22, 3, 14, 11, 12, 14, 3, 2, 24, 14, 24, 26, 10, 5, 25, 26, 23, 22, 24, 12, 5, 22, 19, 17, 14, 24, 6, 24, 4, 5, 5, 14, 15, 27, 27, 13, 25, 13, 24, 5, 2, 6, 15, 29, 22, 19, 24, 22, 15, 12, 11, 15, 25, 5, 12, 11, 23, 23, 5, 4, 3, 24, 10, 19, 29, 8, 24, 29, 17, 11, 29, 24, 28, 6, 9, 19, 11, 27, 19, 17, 11, 13, 9, 25, 17, 9, 19, 28, 17, 19, 8, 11, 3, 25, 10, 10, 13, 21, 11, 21, 21, 8, 2, 23, 8, 12, 27, 4, 4, 5, 23, 12, 28, 2, 17, 19, 11, 6, 19, 17, 8, 11, 9, 8, 11, 3, 22, 4, 25, 14, 24, 12, 17, 3, 17, 28, 17, 26, 13, 2, 5, 29, 23, 2, 14, 24, 4, 11, 28, 24, 10, 27, 4, 26, 4, 28, 22, 28, 15, 29, 4, 28, 29, 22, 8, 26, 5, 8, 10, 4, 14, 27, 23, 

51683
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 
0, 22, 28, 15, 9, 3, 8, 3, 6, 5, 9, 29, 0, 12, 2, 2, 25, 16, 16, 5, 16, 16, 4, 19, 16, 8, 5, 22, 3, 16, 4, 12, 7, 3, 2, 16, 7, 16, 5, 12, 1, 5, 12, 1, 22, 22, 12, 5, 22, 19, 3, 19, 26, 4, 26, 4, 29, 9, 19, 1, 12, 27, 13, 29, 15, 4, 5, 2, 6, 15, 15, 3, 19, 8, 5, 15, 13, 7, 3, 16, 5, 5, 11, 23, 12, 5, 15, 2, 6, 15, 9, 29, 0, 8, 29, 26, 0, 29, 22, 2, 6, 9, 27, 11, 27, 7, 1, 11, 13, 9, 7, 16, 16, 19, 7, 11, 1, 19, 11, 6, 15, 28, 28, 13, 28, 11, 25, 1, 28, 2, 23, 25, 12, 27, 16, 4, 5, 23, 22, 7, 2, 23, 27, 11, 6, 19, 9, 8, 11, 19, 8, 11, 22, 22, 4, 27, 0, 29, 12, 0, 23, 22, 19, 15, 26, 0, 2, 25, 29, 23, 2, 19, 26, 5, 23, 7, 2, 0, 27, 4, 3, 4, 28, 22, 28, 15, 29, 1, 28, 29, 0, 8, 12, 2, 8, 22, 4, 1, 27, 8, 

40581
1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 
0, 18, 0, 14, 29, 2, 9, 2, 23, 4, 8, 29, 9, 13, 8, 15, 13, 15, 15, 4, 11, 13, 3, 4, 16, 3, 29, 24, 4, 13, 3, 4, 6, 2, 1, 26, 6, 23, 11, 9, 29, 24, 11, 22, 0, 23, 11, 4, 18, 22, 2, 12, 23, 26, 16, 3, 1, 24, 13, 0, 11, 26, 2, 29, 14, 26, 4, 13, 13, 4, 23, 8, 12, 23, 14, 4, 18, 10, 2, 13, 4, 24, 4, 23, 6, 16, 14, 1, 23, 6, 8, 23, 18, 26, 24, 25, 29, 12, 11, 2, 1, 8, 18, 10, 26, 18, 25, 22, 12, 8, 24, 0, 8, 18, 6, 10, 13, 18, 12, 29, 14, 9, 1, 12, 0, 10, 13, 0, 2, 1, 9, 9, 11, 8, 25, 25, 4, 4, 10, 0, 3, 22, 18, 10, 10, 12, 8, 15, 10, 8, 11, 15, 0, 25, 3, 29, 4, 22, 23, 16, 22, 22, 18, 16, 25, 24, 1, 29, 24, 22, 16, 13, 23, 3, 22, 16, 1, 13, 26, 3, 6, 3, 29, 12, 1, 14, 26, 0, 1, 29, 29, 24, 22, 8, 22, 9, 23, 0, 26, 22, 

30331
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 
0, 22, 1, 15, 26, 26, 8, 3, 6, 5, 9, 4, 6, 12, 27, 2, 1, 16, 16, 5, 12, 14, 4, 5, 17, 9, 21, 22, 20, 14, 4, 12, 7, 3, 2, 24, 7, 24, 26, 10, 1, 12, 26, 1, 3, 17, 4, 5, 22, 19, 17, 14, 26, 27, 21, 23, 5, 25, 14, 1, 17, 27, 22, 25, 15, 21, 5, 26, 24, 8, 18, 3, 19, 8, 14, 19, 9, 11, 4, 16, 5, 5, 11, 23, 20, 5, 15, 2, 24, 15, 9, 7, 27, 24, 16, 17, 5, 23, 11, 7, 6, 9, 19, 11, 27, 19, 11, 11, 11, 9, 7, 17, 21, 1, 4, 17, 1, 8, 11, 3, 15, 10, 10, 6, 10, 11, 21, 20, 5, 21, 10, 8, 23, 27, 16, 26, 0, 23, 14, 7, 4, 3, 27, 4, 6, 19, 11, 8, 18, 9, 8, 11, 22, 27, 4, 25, 0, 24, 12, 0, 23, 20, 19, 17, 11, 0, 2, 10, 16, 22, 21, 14, 24, 20, 11, 23, 2, 18, 27, 4, 3, 4, 19, 22, 21, 15, 27, 1, 8, 20, 16, 8, 26, 20, 8, 10, 4, 1, 27, 8, 

36813
1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
0, 20, 21, 8, 2, 1, 8, 3, 26, 10, 9, 7, 0, 29, 27, 2, 7, 16, 16, 5, 16, 16, 16, 19, 16, 9, 5, 0, 3, 16, 11, 5, 7, 3, 2, 16, 7, 24, 26, 10, 1, 0, 8, 1, 7, 22, 20, 15, 19, 19, 3, 11, 24, 27, 24, 28, 2, 5, 20, 15, 10, 27, 22, 29, 15, 24, 19, 2, 23, 15, 29, 9, 2, 8, 15, 15, 19, 11, 3, 16, 5, 25, 11, 23, 20, 5, 15, 2, 24, 25, 9, 24, 0, 22, 29, 26, 20, 10, 22, 9, 29, 22, 27, 11, 27, 7, 1, 11, 11, 9, 25, 1, 29, 29, 7, 27, 20, 19, 5, 7, 15, 10, 10, 2, 1, 11, 29, 21, 8, 21, 28, 8, 23, 9, 24, 26, 5, 5, 19, 1, 21, 23, 1, 11, 5, 25, 1, 8, 11, 9, 8, 11, 5, 27, 2, 25, 0, 29, 24, 28, 23, 22, 1, 15, 11, 0, 10, 25, 19, 23, 2, 19, 24, 20, 25, 7, 2, 0, 27, 29, 7, 8, 28, 15, 28, 26, 29, 1, 28, 20, 16, 8, 26, 20, 8, 10, 24, 1, 27, 8, 

54253
1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 
0, 20, 21, 15, 9, 13, 8, 6, 6, 5, 9, 4, 0, 16, 9, 2, 1, 16, 16, 20, 16, 24, 18, 5, 17, 9, 5, 0, 5, 16, 6, 10, 18, 9, 2, 16, 1, 24, 20, 5, 27, 5, 8, 1, 10, 22, 19, 5, 0, 19, 17, 13, 24, 4, 24, 28, 15, 9, 20, 15, 17, 11, 22, 29, 4, 23, 5, 2, 24, 15, 19, 4, 2, 8, 20, 19, 13, 11, 0, 16, 5, 5, 11, 24, 20, 5, 15, 6, 6, 10, 19, 29, 0, 27, 29, 24, 20, 8, 22, 28, 6, 9, 1, 11, 27, 19, 28, 23, 13, 9, 1, 17, 29, 24, 29, 17, 18, 19, 11, 28, 20, 10, 10, 13, 28, 15, 21, 20, 5, 21, 23, 8, 23, 9, 16, 28, 2, 23, 22, 9, 6, 17, 19, 11, 11, 19, 11, 8, 11, 0, 8, 11, 5, 22, 2, 24, 5, 24, 24, 17, 19, 8, 1, 15, 6, 0, 9, 15, 29, 22, 2, 13, 24, 5, 28, 10, 2, 18, 27, 15, 23, 4, 28, 22, 28, 15, 29, 17, 28, 29, 16, 8, 24, 20, 23, 10, 4, 1, 27, 8, 

41282
1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 
23, 4, 6, 8, 2, 0, 10, 6, 26, 25, 26, 4, 10, 14, 3, 24, 14, 16, 16, 5, 13, 16, 4, 5, 17, 8, 5, 22, 3, 16, 4, 5, 18, 2, 2, 11, 0, 24, 24, 17, 14, 25, 12, 23, 22, 22, 3, 5, 22, 23, 17, 14, 5, 4, 24, 4, 2, 5, 14, 15, 17, 11, 13, 25, 0, 24, 5, 14, 26, 10, 18, 3, 2, 8, 22, 15, 16, 22, 3, 14, 5, 25, 5, 23, 23, 5, 15, 2, 6, 5, 15, 28, 0, 21, 29, 17, 2, 29, 14, 3, 6, 3, 28, 11, 5, 6, 17, 23, 13, 18, 25, 16, 29, 17, 29, 17, 10, 8, 11, 18, 15, 29, 10, 13, 12, 5, 21, 25, 5, 2, 23, 8, 23, 22, 16, 26, 2, 5, 22, 15, 4, 17, 28, 15, 11, 13, 11, 8, 11, 18, 8, 11, 5, 22, 4, 25, 0, 24, 12, 17, 26, 8, 28, 17, 26, 0, 2, 5, 29, 13, 2, 14, 24, 4, 23, 10, 2, 18, 2, 4, 26, 4, 28, 22, 28, 11, 29, 17, 28, 29, 16, 8, 23, 2, 8, 10, 4, 0, 2, 8, 
Here is a basic implementation of CVRP in Python using the Google OR-Tools library: ```python from ortools.constraint_solver import routing_enums_pb2 from ortools.constraint_solver import pywrapcp def create_data_model(): """Stores the data for the problem.""" data = {} data['distance_matrix'] = [ [0, 548, 776, 696, 582, 274, 502, 194, 308, 194, 536, 502], [548, 0, 684, 308, 194, 502, 730, 354, 696, 742, 1084, 594], [776, 684, 0, 992, 878, 502, 274, 810, 468, 742, 400, 1278], [696, 308, 992, 0, 114, 650, 878, 502, 844, 890, 1232, 514], [582, 194, 878, 114, 0, 536, 764, 388, 730, 776, 1118, 400], [274, 502, 502, 650, 536, 0, 228, 308, 194, 240, 582, 810], [502, 730, 274, 878, 764, 228, 0, 536, 194, 468, 354, 1016], [194, 354, 810, 502, 388, 308, 536, 0, 342, 388, 730, 468], [308, 696, 468, 844, 730, 194, 194, 342, 0, 274, 388, 810], [194, 742, 742, 890, 776, 240, 468, 388, 274, 0, 342, 650], [536, 1084, 400, 1232, 1118, 582, 354, 730, 388, 342, 0, 878], [502, 594, 1278, 514, 400, 810, 1016, 468, 810, 650, 878, 0] ] data['num_vehicles'] = 3 data['vehicle_capacities'] = [100, 100, 100] data['depot'] = 0 return data def print_solution(data, manager, routing, solution): """Prints solution on console.""" total_distance = 0 total_load = 0 for vehicle_id in range(data['num_vehicles']): index = routing.Start(vehicle_id) plan_output = 'Route for vehicle {}:\n'.format(vehicle_id) route_distance = 0 route_load = 0 while not routing.IsEnd(index): node_index = manager.IndexToNode(index) route_load += data['demands'][node_index] plan_output += ' {} Load({}) -> '.format(node_index, route_load) previous_index = index index = solution.Value(routing.NextVar(index)) route_distance += routing.GetArcCostForVehicle( previous_index, index, vehicle_id) plan_output += ' {} Load({})\n'.format(manager.IndexToNode(index), route_load) plan_output += 'Distance of the route: {}m\n'.format(route_distance) plan_output += 'Load of the route: {}\n'.format(route_load) print(plan_output) total_distance += route_distance total_load += route_load print('Total distance of all routes: {}m'.format(total_distance)) print('Total load of all routes: {}'.format(total_load)) def main(): """Entry point of the program.""" data = create_data_model() manager = pywrapcp.RoutingIndexManager(len(data['distance_matrix']), data['num_vehicles'], data['depot']) routing = pywrapcp.RoutingModel(manager) def distance_callback(from_index, to_index): """Returns the distance between the two nodes.""" from_node = manager.IndexToNode(from_index) to_node = manager.IndexToNode(to_index) return data['distance_matrix'][from_node][to_node] transit_callback_index = routing.RegisterTransitCallback(distance_callback) routing.SetArcCostEvaluatorOfAllVehicles(transit_callback_index) dimension_name = 'Capacity' routing.AddDimension( transit_callback_index, 0, # no slack 100, # vehicle maximum capacities True, # start cumul to zero dimension_name) capacity_dimension = routing.GetDimensionOrDie(dimension_name) for i, demand in enumerate(data['demands']): index = manager.NodeToIndex(i) capacity_dimension.SetDemand(index, demand) for vehicle_id in range(data['num_vehicles']): index = routing.Start(vehicle_id) capacity_dimension.CumulVar(index).SetRange(data['vehicle_capacities'][vehicle_id], data['vehicle_capacities'][vehicle_id]) search_parameters = pywrapcp.DefaultRoutingSearchParameters() search_parameters.first_solution_strategy = ( routing_enums_pb2.FirstSolutionStrategy.PARALLEL_CHEAPEST_INSERTION) solution = routing.SolveWithParameters(search_parameters) if solution: print_solution(data, manager, routing, solution) if __name__ == '__main__': main() ``` Note that this is just a basic implementation and can be modified to suit specific requirements and constraints of individual problem instances.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值