Special Prime(数论+思维)

Special Prime

 Give you a prime number p, if you could find some natural number (0 is not inclusive) n and m, satisfy the following expression:

这里写图片描述
We call this p a “Special Prime”.
AekdyCoin want you to tell him the number of the “Special Prime” that no larger than L.
For example:
If L =20
1^3 + 7*1^2 = 2^3
8^3 + 19*8^2 = 12^3
That is to say the prime number 7, 19 are two “Special Primes”.
Input
The input consists of several test cases.
Every case has only one integer indicating L.(1<=L<=10^6)
Output
For each case, you should output a single line indicate the number of “Special Prime” that no larger than L. If you can’t find such “Special Prime”, just output “No Special Prime!”
Sample Input

7
777

Sample Output

1
10

Hint
这里写图片描述

题意:

给你一个数L,问不超过L的范围内有多少素数可以满足上面是式子,其中mn都是非零自然数

分析:

我们已知式子

n3+pn2=m3 n 3 + p ⋅ n 2 = m 3

观察所给的例子我们发现,好像n都是立方数

我们进一步给式子变形得到:

n2(p+n)=m3 n 2 ( p + n ) = m 3

我们观察到n都是立方数,那么只需要使得 p+n p + n 也是立方数就能满足式子

即设 n=b3,p+n=a3 n = b 3 , p + n = a 3

所以 (b3)2a3=(b2)3a3=(b2a)3=m3 ( b 3 ) 2 ⋅ a 3 = ( b 2 ) 3 ⋅ a 3 = ( b 2 a ) 3 = m 3

因此我们可以得到:

p+b3=a3 p + b 3 = a 3

p=a3b3=(ab)(a2+ab+b2) p = a 3 − b 3 = ( a − b ) ( a 2 + a b + b 2 )

我们得到了素数p的一个乘积的形式

所以 ab=1 a − b = 1

a=b+1 a = b + 1

我们带入原式得到:

p=(b+1)2+(b+1)b+b2=3b2+3b+1 p = ( b + 1 ) 2 + ( b + 1 ) b + b 2 = 3 b 2 + 3 b + 1

我们把右边变成完全平方的形式

两边先同乘12

12p=36b2+36b+12 12 p = 36 b 2 + 36 b + 12

12p=36b2+36b+9+3=(6b+3)2+3 12 p = 36 b 2 + 36 b + 9 + 3 = ( 6 b + 3 ) 2 + 3

所以

12p3=(6b+3)2 12 p − 3 = ( 6 b + 3 ) 2

因此我们只需判断12p-3是否是完全平方数即可其中p是素数

code:

#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e6+10;
bool isprime[maxn];
int prime[maxn];
int cnt;
void init(){
    memset(isprime,true,sizeof(isprime));
    isprime[0] = isprime[1] = false;
    cnt = 0;
    prime[1] = 0;
    for(int i = 2; i < maxn; i++){
        if(isprime[i]){
            int p = 12 * i - 3;
            int tmp = sqrt(p);
            if(tmp * tmp == p) cnt++;
            for(int j = i + i; j < maxn; j += i){
                isprime[j] = false;
            }
        }
        prime[i] = cnt;
    }
}
int main(){
    init();
    int l;
    while(~scanf("%d",&l)){
        if(prime[l] == 0)
            printf("No Special Prime!\n");
        else
            printf("%d\n",prime[l]);
    }
    return 0;
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值