CodeChef November Challenge 2013 » Yet Another Cute Girl

来源:互联网 发布:淘宝买ipad哪家可靠 编辑:程序博客网 时间:2024/05/29 11:53

题目:Yet Another Cute Girl 

Chef doesn't love math anymore. He loves Sasha. Sashen'ka is cute.

Chef goes on a date with her. Flowers are boring, while numbers are not. He knows that most of all this girl loves numbers, that's why he is going to bring ribbon with numbers L, L+1, L+2, ..., R written on it.

Sasha thinks that numbers with prime number of divisors are special. That's why she is going to kiss boy for each such number he will bring.

Now Chef wonder how many times he will be kissed by Sashen'ka ?

 

Input

The first line of the input contains an integer T denoting the number of test cases. The description of Ttest cases follows.
The first line of each test case contains two number L, R.

 

Output

For each test case, output a single line containing answer for corresponding test case.

 

Constraints

  • 1 ≤ T ≤ 5
  • 1 ≤ L ≤ R ≤ 1012
  • 0 ≤ R-L ≤ 106

 

Example

Input:11 10Output:6

 

Explanation

Example case 1. Numbers 2,3,4,5,7,9 are special.



思路:就是求区间内素数的个数,再加上一个prime[i]^(prime[j]-1)的形式的个数


#include <cstdio>#include <iostream>#include <cstring>#include <cmath>#include <algorithm>#include <map>#include <vector>#include <set>using namespace std;#define maxn 1000100long long num[79000];bool prime[maxn];int n_prime=0;bool cnt[1000001];map<long long,int>m;vector<long long>v;long long l,r;void Prime(){    memset(prime,true,sizeof(prime));    prime[0]=prime[1]=0;    for(int i=2;i<maxn;i++)        if(prime[i])        {            num[++n_prime]=i;            for(int j=2*i;j<maxn;j+=i)                prime[j]=0;        }    //cout<<n_prime<<":"<<num[n_prime]<<endl;}void make_prime(){    m.clear();    long long tmp;    memset(cnt,true,sizeof(cnt));    for(int i=1;i<=n_prime;i++)    {        tmp=l/num[i];        while(tmp*num[i]<l||tmp<=1)            tmp++;        for(long long j=tmp*num[i];j<=r;j+=num[i])        {            if(j>=l&&j<=r)                cnt[j-l]=0;        }    }    if(l==1)        cnt[0]=0;    for(long long i=0;i+l<=r;i++)        if(cnt[i]&&i+l<=r&&i>=0)            m[i+l]++;}long long Pow(long long a,long long b){    long long ans=1;    while(b)    {        if(b&1)        {            b--;            ans*=a;        }        else        {            b/=2;            a*=a;        }    }    return ans;}int main(){    Prime();    long long tmp;    v.clear();    for(int i=1;i<n_prime && num[i]*num[i]<1e12;i++)    {        for(int j=2;j<n_prime;j++)        {             tmp=Pow(num[i],num[j]-1);            if(tmp>1e12)                break;            v.push_back(tmp);        }    }    sort(v.begin(),v.end());    int T;    scanf("%d",&T);    while(T--)    {        scanf("%lld%lld",&l,&r);        make_prime();        printf("%d\n",m.size()+(upper_bound(v.begin(),v.end(),r)-lower_bound(v.begin(),v.end(),l)));    }    return 0;}




原创粉丝点击