C. Primitive Primes
题意
给定两个本原多项式,两个多项式相乘,得h(x),随便找到h(x)的某一项系数\(C_t\),输出t即可。
思路
首先就是不能被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\),输出对应的下标和即可。代码实现
#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; }