Codeforces CodeCraft-20 (Div. 2) C. Primitive Primes

链接: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}

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

h ( x ) = f ( x ) g ( x ) h(x) = f(x)*g(x)
输出 h ( x ) h(x) 中系数不可被k整除的一项,任意一项即可。
例如: 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
h ( x ) h(x) 的第一项和第二项的系数5,3都不可被 k k 整除,故输出 1 2皆可

思路:
一开始直接上了一个FFT的模板,很不出意料的WA了。然后开始优化,改错 结束了也并没有写出来。
后来接触了一种解法,找到 f , g f,g 的系数中 不可被 k k 整除的最后一项假设为 a b a,b ,然后答案就是 a + b a+b
后来我稍稍的证明了一下:
f g f,g 中,第 a b a,b 项的系数是 c a , c b c_a,c_b
因为 c a c b c_a,c_b 是不被 k k 整除的,所以 c a c b c_a*c_b 肯定不会被 k k 整除
同时如果 a , b a,b 是系数不可被 k k 整除的最后一项,那么 a , b a,b 后面要么没有项数,要么该项的系数是可以被 k k 整除的。*******************************(结论1)

在计算 h h ,合并同阶时,跟第 a , b a,b 项的乘积同阶 p , q p,q 的乘积只用两种情况,

  1. p < a   a n d   q > b p<a \ and \ q>b
  2. p > a   a n d   q < b p>a \ and \ q<b

因为 (结论1) 可以知道 p , q p,q 乘积的系数肯定能够被 k k 整除,再加上 a , b a,b 项的系数乘积那么,所得的最后乘积肯定是不会被 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;
    
}
发布了141 篇原创文章 · 获赞 71 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/sinat_40872274/article/details/104673165