1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74
| #include<bits/stdc++.h> #define mp make_pair #define ll long long using namespace std; const int mxn=1000005; int n,m; int a[mxn],b[mxn],c[mxn]; vector<int>g[mxn]; int overban,t_o,mx; bool use[mxn]; inline void dfs(int x){ if(use[x])return; use[x]=1; if(x<=n)mx=max(mx,c[x]); for(int it=0;it<g[x].size();++it){ int y=g[x][it]; int ma=max(x,y); if(ma<=overban)continue; dfs(y); } } inline pair<int,int> solve(int xx){ overban=xx; t_o=xx-n; int res=0,cnt=0; memset(use,0,sizeof(use)); for(int i=1;i<=n;++i){ if(!use[i]){ mx=0; dfs(i); if(mx)++cnt; res+=mx; } } return mp(cnt,res); } pair<int,int>ans[mxn]; int main(){ scanf("%d%d",&n,&m); for(int i=1;i<=n;++i){ scanf("%d",a+i); for(int x=2;x*x<=a[i];++x){ if(a[i]%(x*x)==0){ g[i].push_back(n+x); g[n+x].push_back(i); } } } for(int i=1;i<=n;++i){ scanf("%d",b+i); int t=b[i],res=1; for(int x=2;x*x*x<=t;++x){ int c=0; for(;t%x==0;t/=x)++c; res=max(res,c); } int t2=sqrt(t); if(t2*t2==t)res=max(res,2); else res=max(res,1); c[i]=res; } for(int i=1;i<=200000;++i){ if(ans[i-1].first==n){ ans[i]=ans[i-1]; continue; } ans[i]=solve(i+n); } for(int i=1;i<=m;++i){ int x;scanf("%d",&x); printf("%d %d\n",ans[x].first,ans[x].second); } return 0; }
|