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 }

 

posted @ 2020-03-05 11:11  古比  阅读(419)  评论(1编辑  收藏  举报