Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <list>
- #include <map>
- #include <set>
- #include <deque>
- #include <stack>
- #include <queue>
- #include <algorithm>
- #include <sstream>
- #include <iostream>
- #include <iomanip>
- #include <cstdio>
- #include <cmath>
- #include <cstdlib>
- #include <memory.h>
- #include <ctime>
- #include <bitset>
- #include <unordered_map>
- #include <unordered_set>
- using namespace std;
- #define ABS(a) ((a>0)?a:-(a))
- #define MIN(a,b) ((a<b)?(a):(b))
- #define MAX(a,b) ((a<b)?(b):(a))
- #define FOR(i,a,n) for (int i=(a);i<(n);++i)
- #define FI(i,n) for (int i=0; i<(n); ++i)
- #define pnt pair <int, int>
- #define mp make_pair
- #define PI 3.1415926535897
- #define MEMS(a,b) memset(a,b,sizeof(a))
- #define LL long long
- #define U unsigned
- int ne[20010][65];
- int a[20010];
- inline bool isprime(int n)
- {
- FOR(i,2,n)
- if (n%i == 0)
- return false;
- return true;
- }
- vector<int> pr;
- vector<pnt > events;
- pair<double, LL> ans[20010];
- int mod=1000000007;
- pair<double, LL> t[100100];
- void modif(int L, int R, int l, int r, int v,pair<double, LL> val)
- {
- if ((l==L) && (r==R))
- {
- t[v]=min(t[v],val);
- return;
- }
- int m=(L+R)/2;
- if (r<=m) {
- modif(L,m,l,r,v+v,val);
- return;
- }
- if (l>m) {
- modif(m+1,R,l,r,v+v+1,val);
- return;
- }
- modif(L,m,l,m,v+v,val);
- modif(m+1,R,m+1,r,v+v+1,val);
- }
- int n,q;
- void get(int L, int R, int v, pair<double, LL> val) {
- val=min(val,t[v]);
- if (L==R)
- {
- if (L<=n)
- ans[L]=val;
- return;
- }
- int m=(L+R)/2;
- get(L,m,v+v,val);
- get(m+1,R,v+v+1,val);
- }
- int main()
- {
- #ifdef wRabbits
- freopen("in.txt", "r", stdin);
- //freopen("out.txt", "w", stdout);
- double beg = clock();
- #endif
- FOR(i,2,61)
- {
- if (isprime(i))
- pr.push_back(i);
- }
- scanf("%d%d",&n,&q);
- FOR(i,0,n)
- {
- scanf("%d",&a[i]);
- }
- FOR(i,2,61)
- ne[n][i]=n;
- int k=1;
- while (k<n)
- k+=k;
- FOR(i,0,k+k)
- t[i]=mp(1e40,0);
- for (int i=n-1; i>=0; --i)
- {
- FOR(j,2,61)
- {
- if (a[i]%j)
- ne[i][j]=ne[i+1][j];
- else
- ne[i][j]=i;
- }
- events.clear();
- FOR(j,0,pr.size())
- {
- int v=pr[j];
- int last=1;
- int cur=v;
- while (cur<=60)
- {
- int c=ne[i][cur];
- if (c == n)
- break;
- while ((events.size()) && (cur%events.back().second == 0) && (events.back().first >= c)) {
- events.pop_back();
- }
- events.push_back(mp(c,cur));
- last=cur;
- cur*=v;
- }
- }
- for (int j=(int)events.size() - 1; j>0; --j)
- {
- if (events[j].second % events[j-1].second == 0)
- events[j].second/=events[j-1].second;
- }
- sort(events.begin(),events.end());
- if (events.size()) {
- pair<double,LL> now=mp(0,1);
- FOR(j,0,events.size())
- {
- if ((j != 0) && (events[j].first != events[j-1].first)) {
- int d1=events[j-1].first-i+1;
- int d2=events[j].first-i;
- modif(1,k,d1,d2,1,now);
- }
- if ((j == 0) && (events[j].first != i)) {
- int d1=1;
- int d2=events[j].first-i;
- modif(1,k,d1,d2,1,now);
- }
- now.first+=log(events[j].second);
- now.second*=events[j].second;
- now.second%=mod;
- }
- int d1=events.back().first-i+1;
- int d2=n-i;
- modif(1,k,d1,d2,1,now);
- } else {
- modif(1,k,1,n-i,1,mp(0,1));
- }
- }
- get(1,k,1,mp(1e40,0));
- FOR(i,0,q)
- {
- int x;
- scanf("%d",&x);
- printf("%d\n",(int)ans[x].second);
- }
- #ifdef wRabbits
- double end = clock();
- fprintf(stderr, "*** Total time = %.3lf ***\n", (end - beg) / CLOCKS_PER_SEC);
- #endif
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement