标签:索引 void int 题意 pre 输出 include etc char
题意
给定两个本原多项式,两个多项式相乘,得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;
}
标签:索引 void int 题意 pre 输出 include etc char
原文地址:https://www.cnblogs.com/AC-AC/p/12427415.html