diff --git a/HDOJ/5869_zxhl.cpp b/HDOJ/5869_zxhl.cpp new file mode 100644 index 0000000..2c1c62e --- /dev/null +++ b/HDOJ/5869_zxhl.cpp @@ -0,0 +1,76 @@ +#include +#include +#include +#include +#include +#include +using namespace std; + +#pragma comment(linker, "/STACK:102400000,102400000") +#define ls i<<1 +#define rs ls | 1 +#define mid ((ll+rr)>>1) +#define pii pair +#define MP make_pair + +typedef long long LL; +const long long INF = 1e18; +const double Pi = acos(-1.0); +const int N = 1e6+10, M = 1e2+11, mod = 1e9+7, inf = 2e9; + +int n,q,a[N],ans[N]; +int gcd(int a, int b) { return b == 0 ? a : gcd(b, a%b);} +vector G[N]; +struct QQ{ + int l,r,id; + bool operator < (const QQ &a) const { + return a.r > r; + } +}Q[N]; +int C[N],vis[N]; +void update(int x,int c) { + for(int i =x; i < N; i+=i&(-i)) C[i] += c; +} +int ask(int x) { + int s =0 ; + for(int i = x; i; i-= i & (-i))s += C[i]; + return s; +} +int main() { + while(scanf("%d%d",&n,&q)!=EOF) { + for(int i = 1; i <= n; ++i) scanf("%d",&a[i]); + for(int i = 0; i <= n; ++i) G[i].clear(); + for(int i = 1; i <= n; ++i) { + int x = a[i]; + int y = i; + for(int j = 0; j < G[i-1].size(); ++j) { + int res = gcd(x,G[i-1][j].first); + if(x != res) { + G[i].push_back(MP(x,y)); + x = res; + y = G[i-1][j].second; + } + } + G[i].push_back(MP(x,y)); + } + memset(C,0,sizeof(C)); + memset(vis,0,sizeof(vis)); + for(int i = 1; i <= q; ++i) {scanf("%d%d",&Q[i].l,&Q[i].r),Q[i].id = i;} + sort(Q+1,Q+q+1); + for(int R = 0, i = 1; i <= q; ++i) { + while(R < Q[i].r) { + R++; + for(int j = 0; j < G[R].size(); ++j) { + int res = G[R][j].first; + int ids = G[R][j].second; + if(vis[res]) update(vis[res],-1); + vis[res] = ids; + update(vis[res],1); + } + } + ans[Q[i].id] = ask(R) - ask(Q[i].l-1); + } + for(int i = 1; i <= q; ++i) cout<