C. Primitive Primes 思维
链接:https://codeforces.com/contest/1316/problem/C
题意:给出两个多项式,得出两式相乘的式子之后,寻找某系数不能够整除p,假如不能整除,则打印此系数对应的未知数的次方
题目保证肯定存在
思路:我们将这两个多项式分别用a[] b[] 数组来表示;
那么:因为答案只要任意打印某个符合条件的次方即可,所以我们遍历一遍a数组,找到第一个不被整除的位置;
然后再遍历一遍b数组,找到第一个不被整除的位置;
那么a数组左边都是被整除的,b数组左边都是被整除的;
a,b数组右边都是不被整除的;
于是,a数组左边的满足跟b数组对应位置相乘得出这一x次方的数x的系数肯定也是被p整除的,因为a数组左边都是被整除的,所以其乘上任意数也是整除p的
同意b数组也是;
于是a b 数组特定位置左右两边的数计算到最后,都是整除p的,只剩下我们找出来的两个特定的位置的数;
因为他们都不整除p,而且p是素数,所以两者相乘之后也不能整除p
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int maxx = 1e6+10; 4 template<typename T>inline void read(T &x) 5 { 6 x=0; 7 static int p;p=1; 8 static char c;c=getchar(); 9 while(!isdigit(c)){if(c=='-')p=-1;c=getchar();} 10 while(isdigit(c)) {x=(x<<1)+(x<<3)+(c-48);c=getchar();} 11 x*=p; 12 } 13 int a[maxx],b[maxx]; 14 int main() 15 { 16 int n,m,p; 17 read(n),read(m),read(p); 18 for(int i=0;i<n;i++)read(a[i]); 19 for(int i=0;i<m;i++)read(b[i]); 20 int x,y; 21 for(int i=0;i<n;i++){ 22 if(a[i]%p){ 23 x=i; 24 break; 25 } 26 } 27 for(int i=0;i<m;i++){ 28 if(b[i]%p){ 29 y=i; 30 break; 31 } 32 } 33 printf("%d\n",x+y); 34 return 0; 35 }