HDU2866 Special Prime

本文针对HDU 2866题目,详细解析了如何寻找满足特定方程的素数。通过数学推导得出方程有解的条件,并利用质数判断算法实现解决方案。

题目网址:http://acm.hdu.edu.cn/showproblem.php?pid=2866

题意:在区间[2,L]内,有多少个素数p,满足方程有解。

 

分析:

原方程变为: n^(b-1) * (p+n) = m ^ b。

一开始,我们会想,这个方程在什么时候是有解的呢??

肯定当左边式子能够凑成形如  X^b 这样的式子对不对??

那么,也就是说,一定不存正整数k使得n = k*p。

即当且仅当gcd(n^(b-1),(p+n)) = 1时方程有解。

为什么??

我们利用反证法可以进行证明:

假设 gcd(n^(b-1) , (p+n)) != 1

则一定存在一个正整数k,使得 n = k*p。

则该等式转化为: (k+1)* k ^ (b-1) * p^b = m ^ b;

要使等式两边相等,那么(k+1)*k^(b-1)必须配成幂次b的形式。

又因为gcd(k,k+1) = 1。

所以它两无公因子,无法配成x的b次方形式。

所以当gcd(n^(b-1) , (p+n) )  != 1时该方程无解。

 

通过上面的证明,我们知道该方程有解的条件。

设 n = x ^ b,  p+n = y^b,

则 m = x ^(b-1) * y   ,  且p = y^b - x^b;

因为p = y^b-x^b = (y-x)*(y^(n-1)+y^(n-2)*x+...+x^(n-1)),

对于上面的式子来自幂方差公式: (a^n - b^n) =(a-b)(a^(n-1) + a^(n-2)*b + ... + b^(n-1))

所以 (y-x)|p ,又因为p为质数, 所以能整除p的只有1与p本身,很明显的, y-x != p ,所以  y-x=1, --->  y = x+1;

所以p = (x+1)^b-x^b;

所以我们只要枚举x然后计算出p并且判断其是否为质数即可。

 

下面帖代码,有问题留言。

 

    #include<cstdio>
    #include<cstring>
    typedef long long LL;
    
    
    bool is_prime(int n){
        if(n <= 1)return false;
        for(int i = 2; i*i <= n; i++)
           if(n % i == 0)return false;
        return true;
    }
    
    int main(){
        int L;
        while(~scanf("%d",&L)){
            int ans = 0;
            int k = 1;
            while((LL)1*(k+1)*(k+1)*(k+1)-k*k*k <= L){
                if(is_prime((LL)1*(k+1)*(k+1)*(k+1) - k*k*k))ans++;
                k++;
            }
            if(ans == 0)printf("No Special Prime!\n");
            else printf("%d\n",ans);
        }
        return 0;
    }

 

转载于:https://www.cnblogs.com/bingdada/p/7788845.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值