2018CCPC女生专场 HDU6287 口算训练 欧拉函数+二分

比赛的时候想到了用欧拉函数,但一直不知道怎么优化区间查询部分,看过标程才发现...我太菜了...什么都不会 

思路主要就是质因数分解+二分。把a1 ,a2 ,...,an 每个数都进行质因数分解,用数组a存储质数x在序列中从左往右出现的位置,对于每个询问二分查找即可求出区间里有多少个质数x。要注意的是数组太大了,要用vector存储。

详细的思路就不写了,代码里有很多注释的地方,看不懂的可以取消注释输出中间变量看看,以下是AC代码:

#include
#include
#include
#include
#include
using namespace std;

const int MAX=100010;
int n,m;
int L,R;
vectora[MAX];

void euler(int n,int x)//欧拉函数,第x个数含有质因数i
{
    for(int i=2;i*i<=n;i++)
        while(n%i==0)
        {
            a[i].push_back(x);
            n/=i;
        }
    if(n>1)
        a[n].push_back(x);
}

bool ask(int x,int k)
{
    //a[x]:含有质因子x的数的位置
    int l=0,r=a[x].size()-1;
    int t=-1,mid;
    //cout<<"L="<

 

你可能感兴趣的:(算法-数学,算法-二分)