设为首页 加入收藏

TOP

CSU1661: Query Mutiple
2015-11-21 00:59:12 来源: 作者: 【 】 浏览:1
Tags:CSU1661: Query Mutiple

Description

One day,Little-Y saw many numbers standing in a row. A question suddenly appeared in her mind, ”From the L-th number to the R-th number, how many of them is a mutiple of P ? (P is a prime number) , and how quickly can I settle this problem ? ”

Input

Mutiple test cases. Please process till the end of file.
For each test case:
The first line contains two positive integers n and q (1<=n,q<=10^5), which means there are n integers standing in a row and q queries followed.
The second line contains n positive integers, a1,a2,a3,…,an (no more than 10^6) . Here, ai means the i-th integer in the row.
The next are q queries, each of which takes one line. For each query, there are three integers L,R,P (1<=L<=R<=n, 1<=P<=10^6, P is gurantteed to be a prime number). Their meanings have been mentioned in the discription.

Output

For each query, output the answer in one line.

Sample Input

6 5
12 8 17 15 90 28
1 4 3
2 6 5
1 1 2
3 5 17
1 6 999983

Sample Output

2
2
1
1
0

HINT

?

Source


题意: 给出一个数组 然后m个询问,每次询问l,r,p,询问数组l~r区间内有几个p的倍数
思路: 首先打出素数表,然后对于数组每个数分解质因子,将相同的质因子作为下标,存包含这些质因子的那些数的坐标,然后可以直接查询范围
#include 
  
   
#include 
   
     #include 
    
      #include 
     
       #include 
      
        #include 
       
         #include
         #include 
         
           #include 
          
            #include 
           
             #include 
            
              #include 
             
               #include 
              
                #include 
               
                 using namespace std; #define lson 2*i #define rson 2*i+1 #define LS l,mid,lson #define RS mid+1,r,rson #define UP(i,x,y) for(i=x;i<=y;i++) #define DOWN(i,x,y) for(i=x;i>=y;i--) #define MEM(a,x) memset(a,x,sizeof(a)) #define W(a) while(a) #define gcd(a,b) __gcd(a,b) #define LL long long #define N 1000000 #define INF 0x3f3f3f3f #define EXP 1e-8 #define lowbit(x) (x&-x) const int mod = 1e9+7; vector
                
                  prime[N+5]; bool vis[N+5]; int pos[N+5],tot; void set() { int i,j; memset(vis,1,sizeof(vis)); for(i = 2; i<=N; i++) { if(vis[i]) { if(N/i
                 
                  1) prime[pos[x]].push_back(i); } for(i = 1; i
                  
                   prime[y][len-1]||r
                   
                    r) R--; printf("%d\n",R-L+1); } } return 0; } 
                   
                  
                 
                
               
              
             
            
           
          
         
       
      
     
    
   
  


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Codeforces #2B The least round .. 下一篇CSU1664: 防水堤坝

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: