预处理:
1 void init(int n) 2 { 3 for (int i = 0;i < n;i++) 4 { 5 dp[i][0] = a[i]; 6 } 7 int bitn = (int)(log(n)/log(2.0)); 8 for (int j = 1;j <= bitn;j++) 9 { 10 for (int i = 0;i < n;i++) 11 { 12 if (i + (1 << j) - 1 >= n) break; 13 dp[i][j] = F(dp[i][j-1],dp[i+(1 << (j-1))][j-1]);//这个F就是一个功能函数 14 } 15 } 16 }
查询:
1 int que(int l,int r) 2 { 3 int k = (int)(log(r-l+1.0) / log(2.0)); 4 return gcd(dp[l][k],dp[r-(1<<k)+1][k]); 5 }