[lnsyoj1107] 统计

题意

给定 L,求所有不超过 L 且满足 n,m>0,n3+pn2=m3 的质数的个数

sol

因式分解,可得 n2(n+p)=m3
n2n+p 都含有质因子 p,则设 n=kp,那么 n+p=(k+1)p
则有 k2(k+1)p3=m3,可得 k2(k+1) 一定为立方数,由于 k2k+1 互质,所以 k2k+1 均为立方数,由于 k2 是一个平方数,所以 k 为立方数,那么 k+1 不可能为立方数,矛盾,因此 n2n+p 不可能都含有质因子
设两者都含有质因子 q,则 n 含有质因子 q,那么 p 含有质因子 q,由于 p 是质数,所以不可能存在其他质因子,矛盾,因此 n2n+p 互质。
由于 m3 是一个立方数,因此 n2n+p 都为立方数,因为 n2 是平方数,那么 n 也为立方数,设 n=x3,n+p=y3,那么 p=y3x3=(yx)(y2+xy+x2),由于 p 是质数,那么 (yx)(y2+xy+x2) 中,有一个值为 1,一个值为 p,若 y2+xy+x2=0,则 x=0,y=1x=1,y=0,而 x>0,y>0,所以 yx=1,则 y=x+1。代入可得 p=(x+1)2+x(x+1)+x2=3x2+3x+1,考虑到这个值可能不为质数,因此还要判断质数。

代码

#include <iostream>
#include <algorithm>
#include <cstring>

using namespace std;
typedef long long LL;

int L;

LL f(int z){
    return (LL) 3 * z * z + 3 * z + 1;
}

bool is_prime(int x){
    if (x == 1) return false;
    for (int i = 2; i <= x / i; i ++ )
        if (x % i == 0) return false;
    return true;
}

int main(){
    scanf("%d", &L);
    int ans = 0;
    for (int z = 1; ; z ++ ){
        if (f(z) > L) break;
        ans += is_prime(f(z));
    }
    printf("%d\n", ans);
}
posted @   是一只小蒟蒻呀  阅读(6)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示