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 <iostream>
#include <stdio.h>
#include <string.h>
#include <string>
#include <stack>
#include <queue>
#include <map>
#include <set>
#include <vector>
#include <math.h>
#include <bitset>
#include <list>
#include <algorithm>
#include <climits>
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<int> 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<i)
                break;
        }
        for(j = (LL)i+i; j<=N; j+=i)
            vis[j] = 0;
    }
    tot = 1;
    for(i = 2; i<=N; i++)
        if(vis[i])
            pos[i] = tot++;
}

int main()
{
    set();
    int i,j,n,m,x,y,l,r,L,R;
    while(~scanf("%d%d",&n,&m))
    {
        for(i = 1; i<tot; i++)
            prime[i].clear();
        for(i = 1; i<=n; i++)
        {
            scanf("%d",&x);
            for(j = 2; j*j<=x; j++)
            {
                if(x%j!=0)
                    continue;
                prime[pos[j]].push_back(i);
                while(x%j==0)
                    x/=j;
            }
            if(x>1)
                prime[pos[x]].push_back(i);
        }
        for(i = 1; i<tot; i++)
            sort(prime[i].begin(),prime[i].end());
        while(m--)
        {
            scanf("%d%d%d",&l,&r,&x);
            y = pos[x];
            int len = prime[y].size();
            if(len==0||l>prime[y][len-1]||r<prime[y][0])
            {
                printf("0\n");
                continue;
            }
            L = lower_bound(prime[y].begin(),prime[y].end(),l)-prime[y].begin();
            R  = lower_bound(prime[y].begin(),prime[y].end(),r)-prime[y].begin();
            if(R==len||prime[y][R]>r)
                R--;
            printf("%d\n",R-L+1);

        }
    }

    return 0;
}
时间: 2024-11-10 14:08:06

CSU1661: Query Mutiple的相关文章

springJDBC和SpringJDBCTemplate解决方案探究

先来看一个纯JDBC的例子,体会一下springJDBC和SpringJDBCTemplate两者的区别 一个Customer类 1 package com.mkyong.customer.model; 2 3 import java.sql.Timestamp; 4 5 public class Customer 6 { 7 int custId; 8 String name; 9 int age; 10 11 12 public Customer(int custId, String nam

【MongoDB】The high query operation of MongoDB(二)

In the last blog, there are three query condition to be described. In the blog, we will continue to what we have leant in the last blog. 1 $mod '$mod' operation is able to make us to do simple mod operation, but is no need to use where sentence. \ 2.

解决query查询输入geometry参数查询不到而通过where条件可以查到的问题

解决query查询输入geometry参数查询不到而通过where条件可以查到的问题 原因: 是因为geometry的坐标系和所要查询的图层不一样导致的(问题引起是由于底图中叠加了不同的坐标系的引起的) 问题描述: 我在公司做好的功能并且测好了,到现场出了问题,发现通过where语句查询时正常的,拉宽查询不正常.并且通过网页打开图层查询请求页面,手动输入代码中得到的geometry查询是可以查到数据的. 问题解决过程: 通过fiddler跟踪请求的http路径(因为arcgisAPI请求arcg

SPOJ375 Query on a tree

https://vjudge.net/problem/SPOJ-QTREE 题意: 一棵树,每条边有个权值 两种操作 一个修改每条边权值 一个询问两点之间这一条链的最大边权 点数<=10000 多组测试数据,case<=20 Example Input: 1 3 1 2 1 2 3 2 QUERY 1 2 CHANGE 1 3 QUERY 1 2 DONE Output: 1 3 #include<cstdio> #include<iostream> #include&

你用什么方法检查PHP脚本的执行效率(通常是脚本执行时间)和数据库SQL的效率(通常是数据库Query时间),并定位和分析脚本执行和数据库查询的瓶颈所在?

腾讯 PHP脚本的执行效率 1, 代码脚本里计时. 2, xdebug统计函数执行次数和具体时间进行分析.,最好使用工具winCacheGrind分析 3, 在线系统用strace跟踪相关进程的具体系统调用. 数据库SQL的效率 sql的explain(mysql),启用slow query log记录慢查询. 通常还要看数据库设计是否合理,需求是否合理等.

java.lang.IllegalArgumentException: Illegal character in query at index 261

在BaseFragment中使用了LoadingPage,而LoadingPage的联网加载使用的是AsyncHttpClient.一直报java.lang.IllegalArgumentException: Illegal character in query at index 261解析不成功,改成OkHttp解析即可. 网上有些方法,说先URLEncode再拼接,如果解决不了,换个联网请求方式,试一下.

Fulltext Index Study3:Query

在query 语句中,可以使用 contains predicate来调用Fulltext Index,实现比like速度更快的查询.使用contains能够进行term的extract匹配查询或term的前缀匹配查询,还能够进行基于词根的steming查询,基于自定义同义词文件的synonym查询,基于距离和顺序的相邻term查询.和like 相比,contains不能进行后缀匹配查询.如果Fulltext Index 能够满足业务需求,那么Fulltext Index是一个非常不错的选择,跟

关于jFinal Db.query与Db.find 的理解

1.Db.query,返回的是List<Model>类型,实际上返回的却是 Model 的数组: 2.Db.find,返回List<Reocrd>类型,实际上是recrod的 list: 3.所以相关Mode中的dao只有find,没有query,只有Db类中既有find也有query,可以灵活运用

一步一步跟我学习lucene(19)---lucene增量更新和NRT(near-real-time)Query近实时查询

这两天加班,不能兼顾博客的更新,请大家见谅. 有时候我们创建完索引之后,数据源可能有更新的内容,而我们又想像数据库那样能直接体现在查询中,这里就是我们所说的增量索引.对于这样的需求我们怎么来实现呢?lucene内部是没有提供这种增量索引的实现的: 这里我们一般可能会想到,将之前的索引全部删除,然后进行索引的重建.对于这种做法,如果数据源的条数不是特别大的情况下倒还可以,如果数据源的条数特别大的话,势必会造成查询数据耗时,同时索引的构建也是比较耗时的,几相叠加,势必可能造成查询的时候数据缺失的情况