您的位置:首页 > 其它

URAL 2070 Interesting Numbers(数论)

2017-03-24 15:35 387 查看
题目地址:http://acm.timus.ru/problem.aspx?space=1&num=2070

题意:给定区间[L,R],求出满意数

1.既是素数又有素数个因子

2.既是合数又有合数个因子

如果一个数是素数,那么他有2个因子,即素数个因子满足条件1

如果是合数

N=p1^k1  *  p2^k2  *  p3^k3  *.........pn^kn

N可以如上分解质因数  

因子数为 n=(k1+1)*(k2+1)*(k3+1)......(kn+1)

当n为合数时满足条件2

显然找其反例更简单即n为素数时的情况跟少

如果n=(k1+1)*(k2+1)*(k3+1)......(kn+1)n必定为合数

如果n=(k1+1) 且(k1+1)为素数的时候,n必定为素数

即 ans=(r-l+1)-card{ x | x=a^(b-1),a.b为素数 }

#include<bits/stdc++.h>
#define N 1000000

using namespace std;

vector<int> prime;
bool book[N+10];
int k=0;
void pp(){
int i,j;
memset(book,true,sizeof(book));
for(i=2,k=0;i<=N;i++){
if(book[i]){
prime.push_back(i);
for(j=2;j*i<=N;j++)
book[j*i]=false;
}
}
}

int judge(long long a,long long b,long long l,long long r){
long long s=1,i;
for(i=1;i<=b;i++){
s*=a;
if(s>r) return 1;
}
if(s<l) return -1;
return 0;
}

long long slove(long long l,long long r){
int t;
long long ans=0;
bool flag;
for(auto i:prime){
flag=true;
for(auto j:prime){
if(j==2) continue;
t=judge(i,j-1,l,r);
if(t==1) break;
else{
flag=false;
if(t==0) ans++;
}
if(flag) break;
}
}

return ans;
}

int main(){
pp();
long long l,r;
scanf("%lld%lld",&l,&r);
printf("%lld\n",r-l+1 -slove(l,r) );
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: