题意:
给出了两个多项式的系数,求两个多项式相乘后问系数不能被 p p p 整除的幂的值
- 高斯引理:两个本原多项式的乘积仍为本原多项式.
- 本原多项式:满足所有系数的最大公因数为 1 1 1 的多项式
用 a i a_i ai表示第一个多项式的 i i i 次方的系数 b i b_i bi表示第二个多项式的 i i i 次方的系数
c i c_i ci表示相乘后 i i i 次方的乘积后的系数
c i = a ∗ b i + a 1 ∗ b i − 1 + … + a i − 1 ∗ b 1 + a i ∗ b 0 c_i=a*b_i+a_1*b_{i-1}+…+a_{i-1}*b_1+a_i*b_0 ci=a∗bi+a1∗bi−1+…+ai−1∗b1+ai∗b0
每个项都有 a 0 a_0 a0 到 a i − 1 a_{i-1} ai−1 或 b 0 b_0 b0 到 b j − 1 b_{j-1} bj−1 的一部分
找到一个找到不可被 p p p 整除的 c t c_t ct,意思是 c t % p ! = 0 c_t\%p!=0 ct%p!=0,即 a % p ! = 0 , b % p ! = 0 a\%p!=0,b\%p!=0 a%p!=0,b%p!=0,
我们找到第一个符合的,记为 a i a_i ai 和 b j b_j bj。在此之前全部系数都可以被 p p p 整除,
当系数为 ( i + j ) (i+j) (i+j) 时, c t = a 0 ∗ b i + j + a 1 ∗ b i + j − 1 + . . . + a i ∗ b j + . . . + a i + j ∗ b 0 c_t=a_0*b_{i+j}+a_{1}*b_{i+j-1}+...+a_i*b_j+...+a_{i+j}*b_0 ct=a0∗bi+j+a1∗bi+j−1+...+ai∗bj+...+ai+j∗b0
此时只有 a i ∗ b j a_i*b_j ai∗bj 不可被 p p p 整除,其他的都可以。
所以一定有 c t % p ! = 0 c_t\%p!=0 ct%p!=0。
给出的是本原多项式就是保证了不是所有系数数都能整除任何一个 m o d mod mod ,这样 a , b a,b a,b 序列都可以找到至少一个满足的下标。
AC代码:
int n, m, p;
int ans, res, x;
int main()
{
n = read();
m = read();
p = read();
ans = -1;
rep(i, 1, n)
{
x = read();
if (ans == -1 && x % p)
ans = i - 1;
}
res = -1;
rep(i, 1, m)
{
x = read();
if (res == -1 && x % p)
res = i - 1;
}
Out(ans + res);
return 0;
}