XTU 1242 Yada Number 巧妙打表

因子{2,3,5,7,11,13}的个数为偶数(0也是)的数为Yada Numebr

问 [1,n]之间有多少个Yada Number;

显然的是 f[ n ] = f[n-1] +( n==Yada Number);问题就在于n可以达到1e9。

太大了,开不出f[n]这么大的数组。

一开始我想把[1,1e9]之间所有Yada Number 按照次序打表在一个数组 id[ ]里,比如前几个Yada Number是{1,4,6,9...},那么id[1]=1 , id[2]=4,id[3]=6, id[4]=9...以此类推。id[ ]数组天生就是升序的,这样就可以二分查找输入的n在id[ ] 数组的位置,如果没有这个值,则输入它左边的那个。比如 n=6 输出 3,n=9输出4,n=8则输出8左边的6的下边3

这样就只需要开一个1e9范围Yada Number数的个数打下的数组id;

但不幸的是,这个数还是太大了,有5亿多,仍是开不出。

最后还是看了下大牛的代码。

把1e9分成5000个20W大小的区间,打表出区间边界(1,200000,400000...)的答案。这样最坏查找最多也是20W-1

/* ***********************************************
Author        :angon
************************************************ */
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;
#define REP(i,k,n) for(int i=k;i




你可能感兴趣的:(XTU 1242 Yada Number 巧妙打表)