找数(线筛,容斥)

找出第N个最小素因子是P的正整数。

Input

一行两个整数N和P(1<=N,P<=10^9),保证P是素数。

Output

如果结果超过10^9则输出0否则输出这个数。

一看到最小质因子就想到了线筛,每个数只会被其最小质因子筛去。并且只需要筛出p以内的质数。再用p以内的质数去筛,比p小的质数可以筛去不合法的,比p大的质数对我们来说毫无意义。
然而p十分小时,线筛是跑不出来的。
怎么办?
容斥,把p以内的质数搞出来,比如说是 a1,a2,a3... (不包括p)
那么二分答案 Ans
Cnt=ΣAns(Paiajak....Jud(Thenumberofa[]))Jud(k)=(kmod2==0?1:1)
根据Cnt值调整Ans

### 关于洛谷平台上的回文质问题 #### 使用欧拉法求解回文质的思路 对于回文质这一类问题,核心在于两个方面:一是如何高效地选出质;二是怎样快速判定一个是否为回文。针对第一个需求,采用线性时间复杂度O(n)级别的欧拉算法可以显著提高效率[^1]。 具体来说,在构建埃氏的基础上改进而来,通过标记最小因子来避免重复合被多次处理的情况发生。当遇到一个新的未被访问过的整值时,则将其加入到已知素列表之中,并利用这些已经确认的小范围内的全部素因去更新更大范围内可能存在的新合状态。 至于第二个条件——验证回文特性,可以通过字符串反转比较的方式轻松完成。即先将待测正整数转换成字符形式,再检查该串与其逆序版本之间是否存在差异即可得出结论。 #### 代码实现 下面给出一段基于上述原理编写的C++程序: ```cpp #include <iostream> #include <vector> using namespace std; bool isPalindrome(int n){ string s=to_string(n); int l=s.length(); for (int i=0;i<l/2;++i) if(s[i]!=s[l-i-1])return false; return true; } const int MAXN = 1e7; // 定义最大检测界限 bitset<MAXN> notPrime; // 布尔组记录非质位置 vector<int> primes; // 动态组存储找到的所有质 void eulerSieve(){ notPrime[0]=notPrime[1]=true; for(long long i=2;i<=MAXN;i++){ if(!notPrime[i]){ primes.push_back(i); // 将当前索引作为新的质保存起来 if(isPalindrome(i)) cout<<i<<" "; // 输出符合条件的回文质 } for(size_t j=0;j<primes.size() && primes[j]*i<=MAXN ;j++){ notPrime[primes[j]*i]=true; if(i%primes[j]==0) break; } } } ``` 此段代码实现了对指定区间内所有满足既是质又是回文性质的据项进行查并打印的功能。其中`isPalindrome()`辅助函用于检验给定参n所代表的具体值是不是具有镜像对称特征;而主体部分则运用了优化后的欧拉技术来进行初步过滤工作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值