传送门
题目大意
给你次询问,每次给你一个
。
然后让你输出,这个数中的因子有多少个并没有在这个数的前
个数的因子中出现过。
思路
标记前面出现的因子,
代表
这个是在第
个数出现的,这样就可以将复杂度降下来~。
代码
int n,x[maxn],y[maxn];
int a[maxn][300];
map<int,int>mp;
int b[maxn];
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d%d",&x[i],&y[i]);
int ans=0;
for(int j=1;j*j<=x[i];j++){
if(x[i]%j==0){
if(mp[j]<(i-y[i])) ans++;
if(x[i]/j!=j){
int tmp=x[i]/j;
if(mp[tmp]<(i-y[i])) ans++;
}
mp[j]=i;
mp[x[i]/j]=i;
}
}
printf("%d\n",ans);
}
}