#include "mpi.h"
#include <iostream>
using namespace std;
const int Tag = 0;
const int root = 0;
double sum_array(double *array, int n) {
double sum = 0;
for (int i = 0; i < n; ++i) {
sum += array[i]; }
return sum; }
int main() {
int rank, commSize;
MPI_Init(NULL, NULL);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &commSize);
double *arr, sum = 0, buffer;
int n;
MPI_Status status;
if (root == rank) {
cout << "n : ";
cin >> n;
arr = new double[n];
for (int i = 0; i < n; ++i)
cin >> arr[i];
int partSize = n/commSize;
int shift = n%commSize;
for (int i = root+1; i < commSize; ++i) {
MPI_Send(arr + shift + partSize*i, partSize, MPI_DOUBLE, i, Tag,
MPI_COMM_WORLD);}
sum = sum_array(arr, shift + partSize);
for (int i = root+1; i < commSize; ++i) {
MPI_Recv(&buffer, 1, MPI_DOUBLE, i, Tag, MPI_COMM_WORLD,
&status);
sum += buffer;} }
else {
MPI_Probe(root, Tag, MPI_COMM_WORLD, &status);
MPI_Get_count(&status, MPI_DOUBLE, &n);
arr = new double[n];
MPI_Recv(arr, n, MPI_DOUBLE, root, Tag, MPI_COMM_WORLD, &status);
sum = sum_array(arr, n);
MPI_Send(&sum, 1, MPI_DOUBLE, root, Tag, MPI_COMM_WORLD); }
delete[] arr;
cout << rank << " : " << sum << endl;
MPI_Finalize();}
I2luY2x1ZGUgIm1waS5oIgojaW5jbHVkZSA8aW9zdHJlYW0+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CmNvbnN0IGludCBUYWcgPSAwOwpjb25zdCBpbnQgcm9vdCA9IDA7CmRvdWJsZSBzdW1fYXJyYXkoZG91YmxlICphcnJheSwgaW50IG4pIHsKZG91YmxlIHN1bSA9IDA7CmZvciAoaW50IGkgPSAwOyBpIDwgbjsgKytpKSB7CnN1bSArPSBhcnJheVtpXTsgfQpyZXR1cm4gc3VtOyB9CmludCBtYWluKCkgewppbnQgcmFuaywgY29tbVNpemU7Ck1QSV9Jbml0KE5VTEwsIE5VTEwpOwpNUElfQ29tbV9yYW5rKE1QSV9DT01NX1dPUkxELCAmcmFuayk7Ck1QSV9Db21tX3NpemUoTVBJX0NPTU1fV09STEQsICZjb21tU2l6ZSk7CmRvdWJsZSAqYXJyLCBzdW0gPSAwLCBidWZmZXI7CmludCBuOwpNUElfU3RhdHVzIHN0YXR1czsKaWYgKHJvb3QgPT0gcmFuaykgewpjb3V0IDw8ICJuIDogIjsKY2luID4+IG47CmFyciA9IG5ldyBkb3VibGVbbl07CmZvciAoaW50IGkgPSAwOyBpIDwgbjsgKytpKQpjaW4gPj4gYXJyW2ldOwppbnQgcGFydFNpemUgPSBuL2NvbW1TaXplOwppbnQgc2hpZnQgPSBuJWNvbW1TaXplOwpmb3IgKGludCBpID0gcm9vdCsxOyBpIDwgY29tbVNpemU7ICsraSkgewpNUElfU2VuZChhcnIgKyBzaGlmdCArIHBhcnRTaXplKmksIHBhcnRTaXplLCBNUElfRE9VQkxFLCBpLCBUYWcsCk1QSV9DT01NX1dPUkxEKTt9CnN1bSA9IHN1bV9hcnJheShhcnIsIHNoaWZ0ICsgcGFydFNpemUpOwpmb3IgKGludCBpID0gcm9vdCsxOyBpIDwgY29tbVNpemU7ICsraSkgewpNUElfUmVjdigmYnVmZmVyLCAxLCBNUElfRE9VQkxFLCBpLCBUYWcsIE1QSV9DT01NX1dPUkxELAomc3RhdHVzKTsKc3VtICs9IGJ1ZmZlcjt9IH0KZWxzZSB7Ck1QSV9Qcm9iZShyb290LCBUYWcsIE1QSV9DT01NX1dPUkxELCAmc3RhdHVzKTsKTVBJX0dldF9jb3VudCgmc3RhdHVzLCBNUElfRE9VQkxFLCAmbik7CmFyciA9IG5ldyBkb3VibGVbbl07Ck1QSV9SZWN2KGFyciwgbiwgTVBJX0RPVUJMRSwgcm9vdCwgVGFnLCBNUElfQ09NTV9XT1JMRCwgJnN0YXR1cyk7CnN1bSA9IHN1bV9hcnJheShhcnIsIG4pOwpNUElfU2VuZCgmc3VtLCAxLCBNUElfRE9VQkxFLCByb290LCBUYWcsIE1QSV9DT01NX1dPUkxEKTsgfQpkZWxldGVbXSBhcnI7CmNvdXQgPDwgcmFuayA8PCAiIDogIiA8PCBzdW0gPDwgZW5kbDsKTVBJX0ZpbmFsaXplKCk7fQ==