#593. 取模优化

取模优化

题目背景

2024 年 8 月 2 日,某位同学在 2024 杭电多校 R5 T4 树论(一)一题种非常熟练地使用了一个广为人知的算法求 \sum

然后呢?

ACTLE\text{AC}\rightarrow \text{TLE}

rank 32rank 46\text{rank 32}\rightarrow \text{rank 46}

最终,他因此没能与理想的 排名 达成契约。

小 F 衷心祝愿大家不再重蹈覆辙。

题目描述

给定 nn 个整数,求 $(\sum\limits_{i=1}^n\sum\limits_{j=1}^n a_i\times a_j) \bmod p$ 的结果。

为了避免读入效率的影响,nn 个整数将根据随机种子使用数据生成器生成,在你的代码里使用 read() 读入。

namespace GenHelper
{
    unsigned z1,z2,z3,z4,b;
    unsigned rand_()
    {
    b=((z1<<6)^z1)>>13;
    z1=((z1&4294967294U)<<18)^b;
    b=((z2<<2)^z2)>>27;
    z2=((z2&4294967288U)<<2)^b;
    b=((z3<<13)^z3)>>21;
    z3=((z3&4294967280U)<<7)^b;
    b=((z4<<3)^z4)>>12;
    z4=((z4&4294967168U)<<13)^b;
    return (z1^z2^z3^z4);
    }
}
void srand(unsigned x)
{using namespace GenHelper;
z1=x; z2=(~x)^0x233333333U; z3=x^0x1234598766U; z4=(~x)+51;}
int read()
{
    using namespace GenHelper;
    int a=rand_()%32767;
    int b=rand_()%32767;
    return (a+b)%32767;
}

在你的程序输入 a1a_1 前,调用 srand(s)

注意本题特殊的时空限制。

输入描述

一行两个正整数 n,p,sn,p,s 分别表示整数个数,模数和随机种子。

输出描述

一行一个整数表示答案。

输入样例

4 7 3

输出样例

0

提示

数据点 数据范围 时空限制
11 n=106,p=1237,1s109n=10^6,p=1237,1\le s\le 10^9 1s,512MB1s,512\text{MB}
22 n=2×106,p=9876,1s109n=2\times 10^6,p=9876,1\le s\le 10^9
33 n=5×106,p=2,1s109n=5\times 10^6,p=2,1\le s\le 10^9
44 n=107,p=7,1s109n=10^7,p=7,1\le s\le 10^9 0.6s,512MB0.6s,512\text{MB}
55 n=2×107,p=998244353,1s109n=2\times 10^7,p=998244353,1\le s\le 10^9
66 n=5×107,p=2,1s109n=5\times 10^7,p=2,1\le s\le 10^9 0.8s,8MB0.8s,8\text{MB}
77 $n=5\times 10^7,p=18446744073709551616,1\le s\le 10^9$ 0.8s,128MB0.8s,128\text{MB}
88 n=5×107,p=4503599627370496,1s109n=5\times 10^7,p=4503599627370496,1\le s\le 10^9