ACdream 1070 神奇的%系列二 (数学+二分)

来源:互联网 发布:乐视电视没网络能看吗 编辑:程序博客网 时间:2024/05/21 09:05

题目链接:
ACdream 1070

题解:
直接用lower_bound()和upper_bound()去二分。

AC代码:

/** this code is made by LzyRapx* Problem: 1070* Verdict: Accepted* Submission Date: 2017-07-09 13:15:09* Time: 2508MS* Memory: 8264KB*/#include<bits/stdc++.h>using namespace std;const int N=123456;int n,q;vector<int>p[N];int solve(int l,int r,int k){    return upper_bound(p[k].begin(),p[k].end(),r) - lower_bound(p[k].begin(),p[k].end(),l);} int main(){    while(~scanf("%d",&n))    {        for(int i=1;i<N;i++){            p[i].clear();        }        int x;        for(int i=1;i<=n;i++)        {            scanf("%d",&x);            p[x].push_back(i);        }        scanf("%d",&q);        int l,r,w;        for(int i=0;i<q;i++)        {            scanf("%d %d %d",&l,&r,&w);            int sum = 0;            for(int j=1;j*j<=w;j++)            {                if(w%j==0)                {                    sum+=solve(l,r,j);                    if(j*j!=w)                    {                        sum+=solve(l,r,w/j);                    }                }            }            printf("%d\n",sum);        }     }     return 0;}