题目链接:
题目大意:
给出n次查询,每次给出x和y,要求找出x的因数中没有在前y个查询的数种出现的个数。
题目分析:
- 用一个mark[MAX]数组记录每一个数作为因子出现的最远位置。
- 然后顺序操作每一次查询,枚举因子,判断因子之前出现的最远距离有没有出现在要求的范围内,如果没出现,更新答案。
- 复杂都O(n⋅n√)
AC代码:
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#define MAX 100007
using namespace std;
int mark[MAX],x,y,n;
int main ( )
{
while ( ~scanf ( "%d" , &n ))
{
memset ( mark , 0x9f , sizeof ( mark ));
for ( int i = 0 ; i < n ; i++ )
{
scanf ( "%d%d" , &x , &y );
int ans = 0;
for ( int j = 1 ; j*j <= x ; j++ )
{
if ( x%j ) continue;
if ( mark[j] < i-y )
ans++;
mark[j] = i;
if ( j != x/j && mark[x/j] < i -y )
ans++;
mark[x/j] = i;
}
printf ( "%d\n" , ans );
}
}
}