• [HDU2866] Special Prime (数论,公式)


    Special Prime

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
    Total Submission(s): 676    Accepted Submission(s): 358

    Problem Description

    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
    13 + 7*12 = 23
    83 + 19*82 = 123
    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<=106)
     
    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
     
     
    题意
    求1—L范围内,满足 n3+p*n2=m的质数p的数量(m,n > 0) 。
     
    题解
    0~30 O( P) 暴力枚举 n,m 判断 p 是否合法,在 n,m 枚举结束时,取一个较大值 P。
     
    100 O[ (√L)](实际可能更优)
    由原式化简可得 n2 * (n+p) = m3
     
    若 n2 和 n+p 间有公共素因子 p ,
    那么 n+p = k * p ,
    即 n = p * (k-1) ,
    带回原式得到 p3 * (k-1)* k = m3
    易证 (k-1)* k 不能用某一个正整数的三次幂表示,所以此情况不成立。
     
    由此可以假设 n = a3n+p = b
    相减得到 p = b3 - a
    根据立方差公式有 p = (b-a)  * (a+ a*b + b2) ,
    由于 p 是素数,(a+ a*b + b2) != 1 ,所以 b-a = 1,
    带入 b 化简可得 p = 3 * a * a + 3 * a + 1
    暴力枚举 a ,算出 p ,判断 p 是否是素数,统计一下就得到答案了。
     
     
    代码
     1 #include<cstdio>
     2 using namespace std;
     3 int L,ans;
     4 bool Prime(int x){
     5     for(int i=2;i*i<=x;i++)
     6         if(x%i==0) return 0;
     7     return 1;
     8 }
     9 int main(){
    10     while(~scanf("%d",&L)){
    11         ans=0;
    12         for(int i=1;3*i*i+3*i+1<=L;i++){
    13             if(Prime(3*i*i+3*i+1)) ans++;
    14         }
    15         if(ans==0) printf("No Special Prime!
    ");
    16         else printf("%d
    ",ans);
    17     }
    18     return 0;
    19 }

     原题链接

  • 相关阅读:
    常见局域网类别
    精确率,召回率,准确率
    create-react-app创建第一个react程序_windows8.1
    编码与解码
    深度学习---嵌套简记
    反向传播算法简记
    MarkDown语法简记
    Vscode中的配置文件的作用简述
    wireshark 更好的查看TCP协议的数据,跟踪tcp流程
    wireshark 基础,颜色规则,过滤条件使用与多条过滤
  • 原文地址:https://www.cnblogs.com/viacol/p/9483827.html
Copyright © 2020-2023  润新知