【C题】CodeCraft-20 (Div. 2)

在这里插入图片描述
题意:
有两个多项式 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模板。。看了下傅里叶变换没静下心来看,看不懂;先码上。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值