CF1316C Primitive Primes
CF1316C 【Primitive Primes】
给出两个多项式\(a_0+a_1x+a_2x^2+\dots +a_{n-1}x^{n-1}\)和\(b_0+b_1x+b_2x^2+ \dots +a_{m-1}x^{m-1}\),每个多项式的系数的\(\gcd\)都为1
给出质数\(p\),求在这两个多项式乘积的系数中,任意一个不能被\(p\)整除的系数
比赛的时候没想到,居然了想用线段树维护,什么都想用线段树。。然后悲惨掉分
设乘积的系数序列为\(c\)
我们可以设在这两个序列中,第一个不能被\(p\)整除的数分别是\(a_i\)和\(b_j\)(肯定会存在这样的\(i,j\),否则它们的gcd就是\(p\)了)
则可以证明要求的系数为\(c_{i+j}\)
\[c_{i+j}=\sum_{k=0}^{i+j}a_k\times b_{i+j-k}
\]
这里假设有足够多的项(\(i+j\leq n,m\))
因为\(a_0,a_1,a_2\dots a_{i-1}\)和\(b_0,b_1,b_2\dots b_{j-1}\)都能被\(p\)整除
所以上面的式子中,只有\(a_i\times b_j\)这一项不能被\(p\)整除,其他项中都含有一个\(a_k(k<i\))或\(b_k(k<j)\)
所以原式相当于一个\(p\)的倍数加一个非\(p\)的倍数的数
那么其当然不能被\(p\)整除
#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cmath>
#include<iomanip>
#include<cstring>
#define reg register
#define EN std::puts("")
#define LL long long
inline int read(){
int x=0,y=1;
char c=std::getchar();
while(c<'0'||c>'9'){if(c=='-') y=0;c=std::getchar();}
while(c>='0'&&c<='9'){x=x*10+(c^48);c=std::getchar();}
return y?x:-x;
}
int n,m,p;
int main(){
n=read();m=read();p=read();
int a=-1,b=-1;
for(reg int x,i=0;i<n;i++){
x=read();
if(x%p&&a==-1) a=i;
}
for(reg int x,i=0;i<m;i++){
x=read();
if(x%p&&b==-1) b=i;
}
std::printf("%d",a+b);
return 0;
}