跳转至

D. 简单题

题面

Hint: mmap写入空文件的处理方式:https://stackoverflow.com/questions/44553907/mmap-sigbus-error-and-initializing-the-file

不要惊慌。你没有看错,这就是一道简单题。

啊偶,虽然在某些比赛中,被标注为“简单题”的题目往往并不简单,但是在这场比赛中,我们确实试图提供一些简单题,以让大家能够更容易地获得更多分数。

你需要用 P 个核心,把 N 个 32 位有符号整数数组中所有元素 + 1,并且求原来(未加一)的数字之和(MOD 100001651)并输出。

输入

input.bin 读入。这是一个二进制文件,用小端法储存储存,可以直接进行内存映射。(题目保证这些数字小于 2^{30}

第一个参数是核心数 P ,表示当前程序运行平台的核心数。第二个参数是 N ,表示数据总数(在32位整数表示范围内)。

输出

输出到 output.bin。也是一个二进制文件,建议直接内存映射写入。

第一个数字是求和取模的结果,后面的数字是修改后的数组。

提交

提交一个 C++ 源程序即可。

编译命令:

g++ -o solution solution.cpp -O1 -fopenmp -std=c++11

一个可能有用的数据生成器

#!/usr/bin/php
<?php

if ($argc != 4) {
    die("USAGE: {$argv[0]} <OUTPUT_PATH> <P> <N_RANGE>\n");
}

function i32_to_bytes(int $n): array
{
    $rslt = [];
    for ($i = 0; $i < 4; ++$i) {
        $rslt[] = $n & 255;
        $n >>= 8;
    }
    return $rslt;
}

function bytes_to_string(array $n): string
{
    $a = array_map(fn (int $num) => chr($num), $n);
    return join('', $a);
}

function i32_to_string(int $n): string
{
    return bytes_to_string(i32_to_bytes($n));
}

$f = fopen($argv[1], "w");

$p = (int) $argv[2];
$n = (1 << ((int) trim($argv[3])));
$n += $n + rand(0, $n / 2);
$part = 1;
$n = floor($n / $part) * $part;
echo "p={$p}, n={$n}" . PHP_EOL;

fwrite($f, i32_to_string($p));
fwrite($f, i32_to_string($n));
for ($i = 0; $i < ($n / $part); ++$i) {
    $m = i32_to_string(rand(0, 1 << 30));
    fwrite($f, $m);
}

fclose($f);

附件

输入样例

下载 input1.bin