#包括#包括使用命名空间标准;typedef unsigned long long int ulong;//======================================================================//该程序为幸运数字(A000959)生成一个b文件//运行“幸运”“打印元素1到//它使用“虚拟筛”,需要O()空间//它的运行速度与显式筛选算法一样快int main(int argc,char*argv[]){//从命令行获取元素数无符号元素=argc<=1?10000:atoi(argv[1]);//为seive创建一个向量矢量幸运;lucky.resize(元素);//显式设置并打印前两个元素//从0索引简化了计算if(元素>=1){幸运[0]=1;cout<<“11”<<endl;}if(元素>=2){幸运[1]=3;cout<<“23”<<endl;}//g是幸运指数[g]<=n+1的最大指数无符号g=0;//计算2个元素的第n个幸运数for(无符号n=2;n<元素;n++){//用幸运[g]将g更新为最大指数如果(幸运[g+1]<=n+1)g++;//现在我们要追踪第n个的位置k//幸运数字在筛选过程中倒退。//k是第n个幸运数字,所以它位于位置n//经过所有的筛选。ulong k=n;//如果幸运[i]>n+1,幸运[i]上的筛子不会改变//第n个幸运数字的位置,也就是说,不是//改变k。所以我们需要反向穿过筛子//幸运的是[i]<=n+1。最后一个这样的筛子是//幸运筛[g],根据g的定义。//所以,我们倒着穿过筛子寻找幸运//幸运[1]=3。for(无符号i=g;i>=1;i--){//这里k是第n个幸运数字的位置//在幸运[i]上的筛子之后。调整位置//在幸运[i]上的筛子之前。k=k*幸运[i]/(幸运[i]-1);}//这里k是第n个幸运数字在//3号筛,即2号筛之后。调整//在2号筛前定位。k=2*k;//这里k是第n个幸运数字在//筛2,即在自然数范围内//(1,2,3,…)从0索引。所以第n个幸运数字是幸运[n]=k+1;//为1索引调整n并打印新值cout<<n+1<<“”<<幸运[n]<<endl;}//我们完成了返回0;}