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\n",ans);
     return 0;
    
    } 

猜你喜欢

转载自www.cnblogs.com/AC-AC/p/12427415.html