Primitive Primes(cf1316C)(思维、数学)

题目传送门

cf网站可能有点卡

题目大意:
给你两个多项式fn(x),gm(x),令h(x)=f(x)*g(x);给定n、m为多项式f、g的项数(最高次幂为n-1、m-1),给出f(x)、g(x)的每一项的系数、保证各自的系数的gcd==1,给出素数p,问你在h中,找出一个t,使得第t项的系数不能被p整除。若有多个,任意输出。

我们假设f中的系数是ai,g中的系数是bi,h中的系数是ci,那么对于ct,我们可以得到:ct=a0*bt+a1*bt-1+…at*b0;。
因为对于ct,我们最多在a0~at, b0 ~ bt 中取值,那么我们不妨假设t为满足条件的最小的t,那么之前的都能被p整除,观察ci的组成,我们发现在t之前的每一个ci,在形如a1*b~t-1的组成项中,必然都能被p整除,所以在符合条件的ct中,必然至少有一项是不能被p整除的,所以在t内一定有两个不能被p整除的ai和bi,我们只要把ai和bi的下标加起来就行。

#include<bits/stdc++.h>
using namespace std;
const int N=1e3+5;
const int inf=0x7fffffff;
typedef long long ll;
#define fi first
#define se second
#define pii pair<int,int>
//#define int long long
#define endl '\n'
signed main()
{
    int n,m,p;
    scanf("%d%d%d",&n,&m,&p);
    int n1=-1,n2=-1;
    for(int i=0;i<n;i++)
    {
        int x;
        scanf("%d",&x);
        if(x%p!=0&&n1==-1)
            n1=i;
    }
    for(int i=0;i<m;i++)
    {
        int x;
        scanf("%d",&x);
        if(x%p!=0&&n2==-1)
            n2=i;
    }
    printf("%d",n1+n2);
}
发布了93 篇原创文章 · 获赞 9 · 访问量 4203

猜你喜欢

转载自blog.csdn.net/Joker_He/article/details/104676802