gym101102J Divisible Numbers(预处理)

题意:spa

给你一个n(1e5)q(1e5)表示n个数的数列,q个询问,每次询问给你l(n),r(n),s(1023),code

s表示一个二进制数列,当前位为1表示对应的这个位上的数出现,好比5表示101,即1和3出现,blog

l,r表示一段区间,这段区间中的每一个数,只要能整除出现的数中的任意一个,就会对答案有1的贡献。class

问每一个询问的贡献。二进制

思路:查询

因为出现了1就确定每一个数都有贡献(都是1的倍数),而后就能够少一位,用512表示9位出不出现的全部状况,di

用n*512的复杂度预处理全部的状况,O(1)查询。co

for(int j=2;j<=10;j++)
    if(x%j==0) s=s|(1<<(j-2));
for(int j=0;j<512;j++)
    sum[j][i]=sum[j][i-1]+((s&j)?1:0);
相关文章
相关标签/搜索