C. Primitive Primes
Posted ac-ac
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C. Primitive Primes相关的知识,希望对你有一定的参考价值。
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 ",ans); return 0; }
以上是关于C. Primitive Primes的主要内容,如果未能解决你的问题,请参考以下文章
思维多项式系数CodeCraft-20 (Div. 2) C. Primitive Primes
Codeforces 1316C - Primitive Primes
S - Primitive Primes CodeForces - 1316C 数学
Codeforces Round #556 (Div. 2) C. Prefix Sum Primes