思路
- 首先我们先来一遍 \(10^6\) 的线性筛,因为这题埃氏筛可能被卡;
- 然后我们对于每一个 \(1\le i\le n\) 都枚举一遍,计算 \(p(i)\) 的和;
- 再来一个 \(\sqrt x\) 的暴力枚举 \(i\),通过 \(i\) 计算出 \(j\),然后判定条件即可。
伪代码
常量 整形 最大长度 = 十的六次 + 5。
整形 质数[最大长度],计数器,甲,答案。
布尔 标记[最大长度]。
函数 无 欧拉筛(甲:整形)
乙 = 2 当 乙 小于等于 甲 后
质数[++计数器] = 乙 若 !标记[乙]
丙 = 1 若 丙 小于等于 计数器
退出 若 乙 * 质数[丙] > 甲
标记[甲 * 质数[丙]] = 1
退出 若 甲 % 质数[j] 等于 零
丙++ 云云
乙++ 云云
云云
函数 布尔 判断(甲:整形)
乙 = 1 若 乙 的平方 小于等于 甲
若 甲 % 乙 等于 零 并且 乙 的平方 不等于 甲 并且 标记[乙] 并且 标记[乙 分之 甲]
返回 真
云云
乙++ 云云
返回 假
云云
欧拉筛(十的六次)
输入(甲)
答案 = 求和(i = [1,甲],C(i))
输出(答案)