Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 40 Accepted Submission(s): 20

#include<bits/stdc++.h>
#define N 200010
using namespace std;
struct node
{
int l,r,id;
};
int prime[N],w[N],b[N],l[N],r[N],ans[N],tree[N];
node q[N];
vector<int> factor[N],v[N];
int n,m;
void get_prime()
{
for (int i=2;i<N;i++)
{
if (!prime[i]) prime[++prime[0]]=i;
for (int j=1;j<=prime[0]&&prime[j]*i<N;j++)
{
prime[prime[j]*i]=1;
if (i%prime[j]==0) break;
}
}
}
void getfactors(int k)
{
factor[k].clear();
int x=w[k];
for (int i=1;prime[i]*prime[i]<=x;i++)
if (x%prime[i]==0)
{
factor[k].push_back(prime[i]);
while(x%prime[i]==0) x/=prime[i];
}
if (x!=1) factor[k].push_back(x);
}
bool cmp(node a, node b)
{
return a.l<b.l;
}
int lowbit(int a)
{
return (a)&(-a);
}
int sum(int a)
{
int s=0;
while (a>0)
{
s+=tree[a];
a-=lowbit(a);
}
return s;
}
void update(int a,int b)
{
while (a<=n)
{
tree[a]+=b;
a+=lowbit(a);
}
}
int main()
{
get_prime();
while(scanf("%d%d",&n,&m)!=EOF&&n!=0&&m!=0)
{
for (int i=0;i<=n;i++) v[i].clear();
for (int i=0;i<=n;i++) tree[i]=0;
for (int i=1;i<=n;i++) scanf("%d",&w[i]);
for (int i=1;i<=m;i++)
{
scanf("%d%d",&q[i].l,&q[i].r);
q[i].id=i;
}
sort(q+1,q+m+1,cmp);
for (int i=1;i<=n;i++) getfactors(i);
for (int i=1;i<N;i++) b[i]=0;
for (int i=1;i<=n;i++)
{
int tmp=0;
for (int j=0;j<(int)factor[i].size();j++)
{
tmp=max(tmp,b[factor[i][j]]);
b[factor[i][j]]=i;
}
l[i]=tmp;
v[l[i]].push_back(i);
}
for (int i=1;i<N;i++) b[i]=n+1;
for (int i=n;i>=1;i--)
{
int tmp=n+1;
for (int j=0;j<(int)factor[i].size();j++)
{
tmp=min(tmp,b[factor[i][j]]);
b[factor[i][j]]=i;
}
if (tmp==n+1) r[i]=0; else r[i]=tmp;
}
int cur=1;
for (int i=0;i<=n;i++)
{
while(cur<=m&&q[cur].l==i)
{
ans[q[cur].id]=sum(q[cur].r)-sum(q[cur].l-1);
cur++;
}
for (int j=0;j<v[i].size();j++)
{
update(v[i][j],1);
if (r[v[i][j]]!=0) update(r[v[i][j]],-1);
}
if (r[i]!=0) update(r[i],1);
}
for (int i=1;i<=m;i++) printf("%d\n",ans[i]);
}
return 0;
}
HDU 4777 Rabbit Kingdom (2013杭州赛区1008题,预处理,树状数组)
原文:http://www.cnblogs.com/wzb-hust/p/4853930.html