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>
- 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
- bool isPrime(int v)
- {
- FOR(i, 2, v)
- {
- if (v%i == 0)
- return false;
- }
- return true;
- }
- vector<vector<double> > l;
- pnt fact[100][5];
- int sz[100];
- vector<int> all[61][61];
- int ans[20010];
- int now[65][5];
- int a[20010];
- int max1[100];
- int max2[100];
- int mod = 1000000007;
- int total[70];
- void gentest()
- {
- printf("20000 20000\n");
- FOR(i, 0, 20000)
- {
- printf("%d ", rand() % 60 + 1);
- }
- FOR(i, 0, 20000)
- printf("%d\n", i + 1);
- }
- int main()
- {
- #ifdef Fcdkbear
- freopen("in.txt", "r", stdin);
- freopen("out.txt", "w", stdout);
- double beg = clock();
- #endif
- int n, q;
- scanf("%d%d", &n, &q);
- FOR(i, 0, n)
- cin >> a[i];
- l.resize(61);
- FOR(i, 2, 61)
- {
- if (isPrime(i))
- {
- double now = 0;
- int v = 1;
- l[i].push_back(0);
- while (v*i <= 60)
- {
- now += log(i);
- v *= i;
- l[i].push_back(now);
- }
- }
- }
- FOR(i, 2, 61)
- {
- int v = i;
- FOR(j, 2, i+1)
- {
- if (i%j)
- continue;
- if (isPrime(j))
- {
- int cnt = 0;
- while (v%j == 0)
- {
- cnt++;
- v /= j;
- }
- fact[i][sz[i]] = mp(j, cnt);
- sz[i]++;
- }
- }
- }
- FOR(i, 1, 61)
- {
- FOR(j, 1, 61)
- {
- FOR(k, 0, sz[i])
- all[i][j].push_back(fact[i][k].first);
- FOR(k, 0, sz[j])
- all[i][j].push_back(fact[j][k].first);
- sort(all[i][j].begin(), all[i][j].end());
- all[i][j].resize(unique(all[i][j].begin(), all[i][j].end()) - all[i][j].begin());
- }
- }
- MEMS(ans, -1);
- FOR(i, 0, q)
- {
- //if (i % 100 == 0)
- //fprintf(stderr, "%d\n", i);
- int x;
- scanf("%d", &x);
- if (ans[x] != -1)
- {
- printf("%d\n", ans[x]);
- continue;
- }
- MEMS(now, 0);
- double bLog = 1e40;
- double nowLog = 0;
- int res = 0;
- int how = -1;
- MEMS(total, 0);
- FOR(j, 0, n)
- {
- int sub = 1;
- if (j >= x)
- {
- sub = a[j - x];
- total[sub]--;
- if (total[sub])
- sub = 1;
- }
- int add = a[j];
- total[add]++;
- if (total[add] > 1)
- add = 1;
- if ((sub != 1) || (add != 1)) {
- FOR(k, 0, all[sub][add].size())
- {
- max1[k] = 0;
- for (int c = (int)l[all[sub][add][k]].size() - 1; c > 0; --c)
- {
- if (now[all[sub][add][k]][c])
- {
- max1[k] = c;
- break;
- }
- }
- }
- FOR(k, 0, sz[sub])
- now[fact[sub][k].first][fact[sub][k].second]--;
- FOR(k, 0, sz[add])
- now[fact[add][k].first][fact[add][k].second]++;
- FOR(k, 0, all[sub][add].size())
- {
- max2[k] = 0;
- for (int c = (int)l[all[sub][add][k]].size() - 1; c > 0; --c)
- {
- if (now[all[sub][add][k]][c])
- {
- max2[k] = c;
- break;
- }
- }
- nowLog += l[all[sub][add][k]][max2[k]];
- nowLog -= l[all[sub][add][k]][max1[k]];
- }
- }
- if ((nowLog < bLog) && (j+1>=x))
- {
- bLog = nowLog;
- how = j;
- }
- }
- MEMS(now, 0);
- FOR(j, how - x + 1, how + 1)
- {
- FOR(k, 0, sz[a[j]])
- now[fact[a[j]][k].first][fact[a[j]][k].second]++;
- }
- LL val = 1;
- FOR(j, 2, 61)
- {
- int s = l[j].size();
- s--;
- for (int k = s; k >= 0; --k)
- {
- if (now[j][k])
- {
- FOR(c, 0, k)
- {
- val *= j;
- val %= mod;
- }
- break;
- }
- }
- }
- ans[x] = val;
- printf("%d\n", ans[x]);
- }
- #ifdef Fcdkbear
- 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