C. Primitive Primes

Posted ac-ac

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C. Primitive Primes相关的知识,希望对你有一定的参考价值。

C. Primitive Primes

  1. 题意

    给定两个本原多项式,两个多项式相乘,得h(x),随便找到h(x)的某一项系数(C_t),输出t即可。

  2. 思路

    首先就是不能被p整除的意思就是(系数) % p != 0,我们可以先假设(a_i)是第一个 % p!= 0的,设(b_j)是第一个 % p != 0的数,那么我们就可以退出这个系数的公式:
    [ (a_0?b_{i+j}+a_1?b_{i+j?1}+…)+a_i?b_j+(a_{i+1}?b_{j?1}+a_{i+2}?b_{j?2}+…) ]
    给定i是(a_i)不可被p整除的最小索引,这意味着(a_0)(a_{i-1})都可被p整除,因此左括号中的项可被p整除。类似地,对于右括号中的项,(b_0)(b_{j-1})都可以被p整除。所以只剩下中间的(a_i?b_j),输出对应的下标和即可。

  3. 代码实现

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    const int maxn = 1e6+10;
    ll a[maxn];
    ll b[maxn]; 
    inline ll read()
    {
     ll s=0,f=1;
     char ch=getchar();
     while(ch<'0'||ch>'9'){  
         if(ch=='-')  //处理负数
             f=-1;
         ch=getchar();  //处理其他字符
     }
     while(ch>='0'&&ch<='9'){
         s=s*10+ch-'0';
         ch=getchar();
     }
     return s*f;
    }
    int main(void){
     ll n,m,p;
     n = read();
     m = read();
     p = read();
     for(int i = 0; i < n; i++){
         a[i] = read();
         a[i] %= p;
     }
     for(int i = 0; i < m; i++){
         b[i] = read();
         b[i] %= p;
     }
     ll ans = 0;
     for(int i = 0; i < n; i++){
         if(a[i]){
             ans = i;
             break; 
         }
     }
     for(int i = 0; i < m; i++){
         if(b[i]){
             ans += i; 
             break;
         }
     } 
     printf("%lld
    ",ans);
     return 0;
    
    } 

以上是关于C. Primitive Primes的主要内容,如果未能解决你的问题,请参考以下文章

思维多项式系数CodeCraft-20 (Div. 2) C. Primitive Primes

Codeforces 1316C - Primitive Primes

S - Primitive Primes CodeForces - 1316C 数学

Codeforces Round #556 (Div. 2) C. Prefix Sum Primes

C. Primes and Multiplication(数学)(防止爆精度)

Codeforces Round #556 (Div. 2) - C. Prefix Sum Primes(思维)