您的位置:首页 > 其它

2015CCPC湖南J题

2016-04-08 00:18 330 查看
题意:问1[,n]区间中,有多少个数,它的2,3,5,7,11,13的这几个因子数目之和为偶数。

预处理出所有的基数x,满足x只含有2,3,5,7,11,3这几个质因子,且数目为偶数。

即: 1 (0个的特殊处理)

2*2 , 2*3 , 2 *4 ,...2*13 , 3*3,

13*13*13*.....

基数x的数目为:13684个

对于一个数n,枚举所有的基数x,对于一个基数x,

f(n/x)即求出[1,n/x]中不含有2,3,5,7,11,13作为因子的数有多少个,

f(n/x) = f(m) = m - m/2- m/3-....+m/2*3+....

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
using namespace std;

typedef long long LL;

const int N = 1000000000 ;
int prime[6] = {2,3,5,7,11,13} ;
int bases[13687]  ;  //13684个基数
int baseSize ;

void dfsPreInit(LL nowNumber , int position , int Size){
if(position == 6){
if(Size % 2 == 0)  bases[baseSize++] = nowNumber ;
return ;
}
while(nowNumber <= N){
dfsPreInit(nowNumber , position+1 , Size)  ;
nowNumber *= prime[position] ;
Size ++ ;
}
}

int calcu(int m){
int res = m  ;
int limit = (1<<6) -1 ;
for(int i = 1 ; i <= limit ; i++){
int Size = 0 ;
int t = 1L ;
for(int j = 0 ; j < 6 ; j++){
if((i&(1<<j)) > 0){
Size++ ;
t *= prime[j] ;
}
}
if((Size&1) > 0) res -= m / t ;
else res += m / t ;
}
return res ;
}

int main(){
baseSize = 0 ;
dfsPreInit(1, 0 , 0);
std::sort(bases , bases + baseSize) ;
int t ;
int sum , n ;
scanf("%d" , &t)  ;
while(t--){
scanf("%d" , &n) ;
sum = 0L ;
for(int i = 0  ; i < baseSize && bases[i] <= n  ; i++){
sum += calcu(n / bases[i]) ;
}
printf("%d\n" , sum) ;
}

return 0 ;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: