2018ccpc女生赛A题口算训练
原题:
#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