Home => ProblemSet => 【模板】Dirichlet 前缀和
Problem2356--【模板】Dirichlet 前缀和

2356: 【模板】Dirichlet 前缀和

Time Limit: 2 Sec  Memory Limit: 256 MB  Submit: 0  Solved: 0
[ Submit ] [ Status ] [ Creator: ][ 参考程序 ]

Description

给定一个长度为 n 的数列 a1,a2,a3,…,an
现在你要求出一个长度为 n 的数列 b1,b2,b3,…,bn,满足
bk=∑(i | k) ai 由于某些神秘原因,这里的 bk 要对 232 取模。

Input

为了避免过大的输入,本题的输入使用随机数生成器。
输入中只有一行两个整数 n,seed。其中 seed 为 32 位无符号整数,用来生成数据。
接下来,你要调用 n 次随机数生成器,分别生成 a1∼an。
对于C/C++选手,生成器模板如下:
#define uint unsigned int
uint seed;
inline uint getnext(){
seed^=seed<<13;
seed^=seed>>17;
seed^=seed<<5;
return seed;
}

对于Pascal选手,生成器模板如下:
var seed:dword;
function getnext:dword;
begin
seed:=seed xor(seed shl 13);
seed:=seed xor(seed shr 17);
seed:=seed xor(seed shl 5);
getnext:=seed;
end;

注意:所有 n 个数均为 32 位无符号整数。

Output

为了避免过大的输出,你只需输出一个 32 位无符号整数,表示所有 bi 的异或和。

Sample Input Copy

5 1477

Sample Output Copy

2608816472

HINT

样例说明:
样例中,数列 a 为 397153977,974453892,352446086,334987182,2086335567。
数列 b 为 397153977,1371607869,749600063,1706595051,2483489544。

限制与约定

对于 100% 的数据, 1≤n≤2×107,0≤seed<232

Source/Category