链接:http://codeforces.com/contest/1316/problem/C
题意:
给出两个方程:
f
(
x
)
=
a
0
+
a
1
x
+
a
2
x
2
+
.
.
.
+
a
n
−
1
x
n
−
1
g
(
x
)
=
b
0
+
b
1
x
+
b
2
x
2
+
.
.
.
+
b
m
−
1
x
m
−
1
f(x) = a_0+a_1x+a_2x^2+...+a_{n-1}x^{n-1} \\ g(x) = b_0+b_1x+b_2x^2+...+b_{m-1}x^{m-1}
f(x)=a0+a1x+a2x2+...+an−1xn−1g(x)=b0+b1x+b2x2+...+bm−1xm−1
g c d ( a 0 , a 1 , … , a n − 1 ) = g c d ( b 0 , b 1 , … , b m − 1 ) = 1 gcd(a_0, a_1, \dots, a_{n-1}) = gcd(b_0, b_1, \dots, b_{m-1}) = 1 gcd(a0,a1,…,an−1)=gcd(b0,b1,…,bm−1)=1
h
(
x
)
=
f
(
x
)
∗
g
(
x
)
h(x) = f(x)*g(x)
h(x)=f(x)∗g(x)
输出
h
(
x
)
h(x)
h(x) 中系数不可被k整除的一项,任意一项即可。
例如:
k
=
2
k = 2
k=2
f
(
x
)
=
2
x
2
+
x
+
1
g
(
x
)
=
2
x
2
+
x
+
1
h
(
x
)
=
2
x
3
+
5
x
2
+
3
x
+
2
f(x) = 2x ^{2} + x + 1\\g(x) = 2x^2 + x + 1\\h(x) = 2x^3 + 5x^2 + 3x + 2
f(x)=2x2+x+1g(x)=2x2+x+1h(x)=2x3+5x2+3x+2
h
(
x
)
h(x)
h(x)的第一项和第二项的系数5,3都不可被
k
k
k 整除,故输出 1 2皆可
思路:
一开始直接上了一个FFT的模板,很不出意料的WA了。然后开始优化,改错 结束了也并没有写出来。
后来接触了一种解法,找到
f
,
g
f,g
f,g的系数中 不可被
k
k
k 整除的最后一项假设为
a
,
b
a,b
a,b,然后答案就是
a
+
b
a+b
a+b。
后来我稍稍的证明了一下:
设
f
,
g
f,g
f,g 中,第
a
,
b
a,b
a,b项的系数是
c
a
,
c
b
c_a,c_b
ca,cb
因为
c
a
,
c
b
c_a,c_b
ca,cb 是不被
k
k
k 整除的,所以
c
a
∗
c
b
c_a*c_b
ca∗cb肯定不会被
k
k
k 整除
同时如果
a
,
b
a,b
a,b 是系数不可被
k
k
k 整除的最后一项,那么
a
,
b
a,b
a,b后面要么没有项数,要么该项的系数是可以被
k
k
k 整除的。*******************************(结论1)
在计算 h h h,合并同阶时,跟第 a , b a,b a,b项的乘积同阶 p , q p,q p,q的乘积只用两种情况,
- p < a a n d q > b p<a \ and \ q>b p<a and q>b
- p > a a n d q < b p>a \ and \ q<b p>a and q<b
因为 (结论1) 可以知道 p , q p,q p,q乘积的系数肯定能够被 k k k 整除,再加上 a , b a,b a,b项的系数乘积那么,所得的最后乘积肯定是不会被 k k k 整除的。
#include<bitset>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
int n,m,k,t,ans1,ans2;
int main(){
scanf("%d %d %d",&n,&m,&k);
for(int i = 0; i < n;++i){
scanf("%d",&t);
if(t%k) ans1 = i;
}
for(int i = 0; i < m;++i){
scanf("%d",&t);
if(t%k) ans2 = i;
}
printf("%d",ans1+ans2);
return 0;
}