Codeforces 1316 C. Primitive Primes

172 阅读2分钟

在这里插入图片描述
在这里插入图片描述

题意:

给出了两个多项式的系数,求两个多项式相乘后问系数不能被 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;
}