ZJNU 1223 - 素数距离——高级
因为最大可以达到int极限 明显直接筛选不可能完成 所以从其因子入手 因为任何不是素数的数都有除了1与其自身之外的因子 因此,我们筛出2^(31/2)≈46350之内的所有素数,以其作为因子再将题目给定区间内的所有不是素数的数标记排除 然后将素数存放在prnum这个vector集合中便于调用 在排除阶段,可以用 l=((L+prnum[i]-1)/prnum[i])*prnum[i] 计算出区间内的第一个是prnum[i]的倍数的数 注意,如果计算出来的使其本身,取倍数 再用 r=R/prnum[i]*prnum[i] 计算出最后一个是prnum[i]的倍数的数 符合条件时,从l到r,每次加prnum[i],标记出所有以prnum[i]为因子的数 因为无法直接开数组标记到大数 但又因为R-L≤1000000 所以可以对位置进行转换 标记时取-L+1,取出时取-1+L 最后将区间内的素数取出放在ans这个vector集合内,对答案进行判断即可 (注意特殊情况的判断) 1 /* 2 Written By StelaYuri 3 */ 4 #include<bits/stdc++.h> 5 using namespace std; 6 typedef long long ll; 7 vector<ll> prnum,ans; 8 bool prim[46400],ar[1000010];