#include <bits/stdc++.h>
#include "dzilib.h"
using namespace std;
typedef pair<int,int> PII;
typedef pair<long long,int> PLI;
typedef pair<int,long long> PIL;
const int mod = 1e9+7;
const unsigned long long B = 1000696969;
int pr[1200005];
int num_div[1200005];
mt19937 gen(2137);
unsigned long long rd[1200005];
map<unsigned long long, int> res;
void init(int n, int qq){
pr[1] = 1;
for(int i=2;i<=n;i++){
if(pr[i] != 0) continue;
pr[i] = i;
for(int j=2*i;j<=n;j+=i){
if(pr[j] == 0) pr[j] = i;
}
}
num_div[1] = 1;
for(int i=2;i<=n;i++){
int p = pr[i];
int k = i;
int cnt = 0;
while(pr[k] == p){
cnt++;
k /= p;
}
num_div[i] = num_div[k]*(cnt+1);
}
for(int i=1;i<=n;i++) rd[i] = ((long long)1e9)*gen()+gen();
// for(int i=1;i<=100;i++) cout<<pr[i]<<" "; cout<<endl;
// for(int i=1;i<=100;i++) cout<<num_div[i]<<" "; cout<<endl;
unsigned long long hash = 0;
unsigned long long Bqq = 1;
for(int i=1;i<qq;i++) Bqq = Bqq*B;
for(int i=1;i<=qq;i++){
hash = hash*B + rd[num_div[i]];
}
for(int i=1;i<=n;i++){
// if(res[hash] != 0){
// cout<<i<<" "<<res[hash]<<" "<<qq<<endl;
// }
// assert(res[hash] == 0);
res[hash] = i;
hash -= Bqq*rd[num_div[i]];
hash = hash*B + rd[num_div[i+qq]];
}
}
void solve(int n, int qq){
unsigned long long hash = 0;
for(int i=0;i<qq;i++){
hash = hash*B + rd[Ask(i)];
}
Answer(res[hash]);
}
int main(){
// ios_base::sync_with_stdio(0);
int t = GetT();
int n = GetN();
int q = GetQ();
int qq = q/t;
init(n+60000, qq);
while(t--){
solve(n, qq);
}
}
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 75 76 77 78 | #include <bits/stdc++.h> #include "dzilib.h" using namespace std; typedef pair<int,int> PII; typedef pair<long long,int> PLI; typedef pair<int,long long> PIL; const int mod = 1e9+7; const unsigned long long B = 1000696969; int pr[1200005]; int num_div[1200005]; mt19937 gen(2137); unsigned long long rd[1200005]; map<unsigned long long, int> res; void init(int n, int qq){ pr[1] = 1; for(int i=2;i<=n;i++){ if(pr[i] != 0) continue; pr[i] = i; for(int j=2*i;j<=n;j+=i){ if(pr[j] == 0) pr[j] = i; } } num_div[1] = 1; for(int i=2;i<=n;i++){ int p = pr[i]; int k = i; int cnt = 0; while(pr[k] == p){ cnt++; k /= p; } num_div[i] = num_div[k]*(cnt+1); } for(int i=1;i<=n;i++) rd[i] = ((long long)1e9)*gen()+gen(); // for(int i=1;i<=100;i++) cout<<pr[i]<<" "; cout<<endl; // for(int i=1;i<=100;i++) cout<<num_div[i]<<" "; cout<<endl; unsigned long long hash = 0; unsigned long long Bqq = 1; for(int i=1;i<qq;i++) Bqq = Bqq*B; for(int i=1;i<=qq;i++){ hash = hash*B + rd[num_div[i]]; } for(int i=1;i<=n;i++){ // if(res[hash] != 0){ // cout<<i<<" "<<res[hash]<<" "<<qq<<endl; // } // assert(res[hash] == 0); res[hash] = i; hash -= Bqq*rd[num_div[i]]; hash = hash*B + rd[num_div[i+qq]]; } } void solve(int n, int qq){ unsigned long long hash = 0; for(int i=0;i<qq;i++){ hash = hash*B + rd[Ask(i)]; } Answer(res[hash]); } int main(){ // ios_base::sync_with_stdio(0); int t = GetT(); int n = GetN(); int q = GetQ(); int qq = q/t; init(n+60000, qq); while(t--){ solve(n, qq); } } |
English