首页 > 其他分享 >2018ccpc女生赛A题口算训练

2018ccpc女生赛A题口算训练

时间:2022-11-25 22:12:15浏览次数:41  
标签:end int bound cin 2018ccpc return 题口算 女生 first

#include<bits/stdc++.h>
using namespace std;
#define ios() ios::sync_with_stdio(false);cin.tie(0);
/*
我们对输入的每一个数字分解质因数,分解过程中把下标存入对应的质因子中数组中。
然后对于每次查询l,r,d,我们只需要对d分解质因数,然后统计当前这个质因数(假设为i)
的个数cnt,如果cnt大于在L~R区间中 i 的个数那么就不行.
*/
vector<int> v[100005]; //G[i]存的是含有i这个因子的下标  
//二维数组存、
int x;

//    lower_bound(first,end,x):
//    first:要查找区间的起始位置(地址)
//    end:要查找区间的结束位置(地址)
//    在first和end区间中返回第一个大于等于x的值的迭代器
//    
//    upper_bound(first,end,x):
//    在first和end区间中返回第一个大于x的值的迭代器

int solve(int l,int r,int d)
{
    int i,j;
    for(int i=2;i<=d/i;i++)
    {
        int sum=0;
        //将d质因数分解,sum统计d中i因子的个数
        while(d%i==0)
        {
            sum++;
            d/=i;
        }
        if(sum)
        {
            //在区间[l,r]中i的个数
            
            int t=upper_bound(v[i].begin(),v[i].end(),r)-lower_bound(v[i].begin(),v[i].end(),l);
            //返回的是迭代器,并不是int类型,可以进行相减
            
            if(t<sum)
                return 0; //数不够
        }
    }
    //若d最后剩下为质数,特别判断
    if(d>1)
    {
        int t=upper_bound(v[d].begin(),v[d].end(),r)-lower_bound(v[d].begin(),v[d].end(),l);
        if(t<1)
            return 0;
    }
    return 1;
}

int main()
{
    int i,j,t,n,m,l,r,d;
    ios();
    cin>>t;
    while(t--)
    {
        cin>>n>>m;
        //清空
        for(int i=0;i<100005;i++)
        {
            v[i].clear();
        }
        
        //质因数分解
        for(i=1;i<=n;i++)
        {
            
            cin>>x;
            for(int j=2;j<=x/j;j++)
            {
                while(x%j==0)
                {
                    v[j].push_back(i);  //不同质因子有哪些对应的下标
                    x/=j;
                }
            }
            
            //x是质数
            if(x>1)
                v[x].push_back(i);
        }
        
        
        for(i=0;i<m;i++)
        {
            int l,r;
            cin>>l>>r>>d;
            if(solve(l,r,d))
                printf("Yes\n");
            else
                printf("No\n");
        }
    }
    
    return 0;
}

标签:end,int,bound,cin,2018ccpc,return,题口算,女生,first
From: https://www.cnblogs.com/-Rebecca/p/16926526.html

相关文章