题意:
有两个多项式 f(x),g(x)
f(x)=a0+a1x+⋯+an−1x^n−1;
g(x)=b0+b1x+⋯+bm−1x^m−1;
gcd(a0,a1,…,an−1)=gcd(b0,b1,…,bm−1)=1;
h(x)=f(x)*g(x);
给定一个质数p;
请输出h(x) 的任意一个系数不被p整除的项的幂次。
代码块:`
#include<bits/stdc++.h>
using namespace std;
#define ll long long int
int main()
{
ios_base::sync_with_stdio(false),cin.tie(0),cout.tie(0);
ll n,i,m,x,a,p,fir,sec;
cin >> n >> m >> p;
a=0;
for(i=0;i<n;i++)
{
cin >> x;
if(x%p && !a)
{
a=1;
fir=i;
}
}
a=0;
for(i=0;i<m;i++)
{
cin >> x;
if(x%p && !a)
{
a=1;
sec=i;
}
}
cout << fir+sec << endl;
return 0;
}
题解:
先找,f(x)里第一个 不被p整除的系数,存下坐标;
再找,g(x)里第一个 不被p整除的系数,存下坐标。
最后将坐标相加(即将幂次相加)就是h(x)里系数不被p整除的项的幂次。
为什么这样写就能保证呢?
我想了好久。。。。。
然后想到了,因为——“第一个”——都是第一个 不被p整除的系数;
就假设两个数是Xfi和Xgj吧,要和这两个数相乘的幂次相等,
无非就是 i更小点的项乘以j更大点的项
或者i更大点的项 乘以 j更小点的项
而无论是i更小点的项,还是j更小点的项,都是可以被p整除的,所以与Xfi*Xgj相同幂次的这些项的系数都是被p整除的,
最后这个项的系数就等于这些系数(可被整除 )+ ai * aj(不可被整除) 之和
所以这个幂次的项的系数必定不被p整除。
然后最后直接输出i+j就好了。
同时给出另一种相似的写法
int main( ) {
scanf("%d %d %d", &n, &m, &p);
for (int i = 0; i < n; i ++) {
scanf("%d", &a[i]);
if (a[i] % p) idx = i;
}
for (int i = 0; i < m; i ++) {
scanf("%d", &b[i]);
if (b[i] % p) idy = i;
}
printf("%d\n", idx + idy);
return 0;
}
这里的保存的是两个函数分别的最后一个不被整除的数。
所以别的项与其之后的项相乘也都是可被p整除。
除了ai * aj。
看到有人说套fft模板。。看了下傅里叶变换没静下心来看,看不懂;先码上。