Advertisement
Slayerfeed

Factormath

May 22nd, 2019
354
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.31 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4. int factornum[100010];
  5. int pi[1000010];
  6. void prefix(int a[],int m){
  7.      pi[1]=0;
  8.     int k=0;
  9.     for(int i=2;i<=m;++i){
  10.         while(k>0&&a[i]!=a[k+1]){
  11.             k=pi[k];
  12.         }
  13.         if(a[i]==a[k+1]){
  14.             ++k;
  15.         }
  16.         pi[i]=k;
  17.     }
  18. }
  19. int factor(int n){
  20.     if(factornum[n]!=0){
  21.         return factornum[n];
  22.     }
  23.     int cnt = 0;
  24.     for(int i=1;i*i<=n;++i){
  25.         if(n%i==0){
  26.             if(n/i==i){
  27.                 ++cnt;
  28.             }
  29.             else{
  30.                 ++cnt;
  31.                 ++cnt;
  32.             }
  33.         }
  34.     }
  35.     return factornum[n]=cnt;
  36. }
  37. int main(){
  38.  
  39.     int n,m;
  40.     scanf("%d%d",&n,&m);
  41.     int a[n+10],b[m+10];
  42.     int x;
  43.     for(int i=1;i<=n;++i){
  44.         scanf("%d",&x);
  45.         a[i] = factor(x);
  46.     }
  47.  
  48.     for(int i=1;i<=m;++i){
  49.         scanf("%d",&x);
  50.         b[i]=factor(x);
  51.     }
  52.     int max=0;
  53.     prefix(b,m);
  54.     int q=0;
  55.     for(int i=1;i<=n;++i){
  56.         while(q>0&&b[q+1]!=a[i]){
  57.             q=pi[q];
  58.         }
  59.         if(b[q+1]==a[i]){
  60.             ++q;
  61.         }
  62.         if(i+(m-q) <= n &&q>max){
  63.             max = q;
  64.         }
  65.         if(q==m){
  66.             max = m;
  67.             q=pi[m];
  68.         }
  69.  
  70.     }
  71.  
  72.     printf("%d",max);
  73.     return 0;
  74. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement