Advertisement
Guest User

Untitled

a guest
Aug 27th, 2015
388
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.39 KB | None | 0 0
  1. #include <list>
  2. #include <map>
  3. #include <set>
  4. #include <deque>
  5. #include <stack>
  6. #include <queue>
  7. #include <algorithm>
  8. #include <sstream>
  9. #include <iostream>
  10. #include <iomanip>
  11. #include <cstdio>
  12. #include <cmath>
  13. #include <cstdlib>
  14. #include <memory.h>
  15. #include <ctime>
  16. #include <bitset>
  17. #include <unordered_map>
  18. #include <unordered_set>
  19.  
  20. using namespace std;
  21.  
  22. #define ABS(a) ((a>0)?a:-(a))
  23. #define MIN(a,b) ((a<b)?(a):(b))
  24. #define MAX(a,b) ((a<b)?(b):(a))
  25. #define FOR(i,a,n) for (int i=(a);i<(n);++i)
  26. #define FI(i,n) for (int i=0; i<(n); ++i)
  27. #define pnt pair <int, int>
  28. #define mp make_pair
  29. #define PI 3.1415926535897
  30. #define MEMS(a,b) memset(a,b,sizeof(a))
  31. #define LL long long
  32. #define U unsigned
  33.  
  34. int ne[20010][65];
  35.  
  36. int a[20010];
  37.  
  38. inline bool isprime(int n)
  39. {
  40.     FOR(i,2,n)
  41.             if (n%i == 0)
  42.                 return false;
  43.     return true;
  44. }
  45.  
  46. vector<int> pr;
  47. vector<pnt > events;
  48. pair<double, LL> ans[20010];
  49.  
  50. int mod=1000000007;
  51. pair<double, LL> t[100100];
  52.  
  53. void modif(int L, int R, int l, int r, int v,pair<double, LL> val)
  54. {
  55.     if ((l==L) && (r==R))
  56.     {
  57.         t[v]=min(t[v],val);
  58.         return;
  59.     }
  60.     int m=(L+R)/2;
  61.     if (r<=m) {
  62.         modif(L,m,l,r,v+v,val);
  63.         return;
  64.     }
  65.     if (l>m) {
  66.         modif(m+1,R,l,r,v+v+1,val);
  67.         return;
  68.     }
  69.     modif(L,m,l,m,v+v,val);
  70.     modif(m+1,R,m+1,r,v+v+1,val);
  71. }
  72. int n,q;
  73.  
  74. void get(int L, int R, int v, pair<double, LL> val) {
  75.     val=min(val,t[v]);
  76.     if (L==R)
  77.     {
  78.         if (L<=n)
  79.             ans[L]=val;
  80.         return;
  81.     }
  82.     int m=(L+R)/2;
  83.     get(L,m,v+v,val);
  84.     get(m+1,R,v+v+1,val);
  85. }
  86.  
  87. int main()
  88. {
  89. #ifdef wRabbits
  90.     freopen("in.txt", "r", stdin);
  91.     //freopen("out.txt", "w", stdout);
  92.     double beg = clock();
  93. #endif
  94.  
  95.     FOR(i,2,61)
  96.     {
  97.         if (isprime(i))
  98.             pr.push_back(i);
  99.     }
  100.     scanf("%d%d",&n,&q);
  101.     FOR(i,0,n)
  102.     {
  103.         scanf("%d",&a[i]);
  104.     }
  105.     FOR(i,2,61)
  106.         ne[n][i]=n;
  107.     int k=1;
  108.     while (k<n)
  109.         k+=k;
  110.     FOR(i,0,k+k)
  111.         t[i]=mp(1e40,0);
  112.     for (int i=n-1; i>=0; --i)
  113.     {
  114.         FOR(j,2,61)
  115.         {
  116.             if (a[i]%j)
  117.                 ne[i][j]=ne[i+1][j];
  118.             else
  119.                 ne[i][j]=i;
  120.         }
  121.         events.clear();
  122.         FOR(j,0,pr.size())
  123.         {
  124.             int v=pr[j];
  125.             int last=1;
  126.             int cur=v;
  127.             while (cur<=60)
  128.             {
  129.                 int c=ne[i][cur];
  130.                 if (c == n)
  131.                     break;
  132.                 while ((events.size()) && (cur%events.back().second == 0) && (events.back().first >= c)) {
  133.                     events.pop_back();
  134.                 }
  135.                 events.push_back(mp(c,cur));
  136.                 last=cur;
  137.                 cur*=v;
  138.             }
  139.         }
  140.         for (int j=(int)events.size() - 1; j>0; --j)
  141.         {
  142.             if (events[j].second % events[j-1].second == 0)
  143.                 events[j].second/=events[j-1].second;
  144.         }
  145.         sort(events.begin(),events.end());
  146.         if (events.size()) {
  147.             pair<double,LL> now=mp(0,1);
  148.             FOR(j,0,events.size())
  149.             {
  150.                 if ((j != 0) && (events[j].first != events[j-1].first)) {
  151.                     int d1=events[j-1].first-i+1;
  152.                     int d2=events[j].first-i;
  153.                     modif(1,k,d1,d2,1,now);
  154.                 }
  155.                 if ((j == 0) && (events[j].first != i)) {
  156.                     int d1=1;
  157.                     int d2=events[j].first-i;
  158.                     modif(1,k,d1,d2,1,now);
  159.                 }
  160.                 now.first+=log(events[j].second);
  161.                 now.second*=events[j].second;
  162.                 now.second%=mod;
  163.             }
  164.             int d1=events.back().first-i+1;
  165.             int d2=n-i;
  166.             modif(1,k,d1,d2,1,now);
  167.         } else {
  168.             modif(1,k,1,n-i,1,mp(0,1));
  169.         }
  170.     }
  171.     get(1,k,1,mp(1e40,0));
  172.     FOR(i,0,q)
  173.     {
  174.         int x;
  175.         scanf("%d",&x);
  176.         printf("%d\n",(int)ans[x].second);
  177.     }
  178.  
  179.  
  180. #ifdef wRabbits
  181.     double end = clock();
  182.     fprintf(stderr, "*** Total time = %.3lf ***\n", (end - beg) / CLOCKS_PER_SEC);
  183. #endif
  184.     return 0;
  185. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement