zoukankan      html  css  js  c++  java
  • hdu-2886 Special Prime---数论推导

    题目链接:

    http://acm.hdu.edu.cn/showproblem.php?pid=2866

    题目大意:

    问你1到L中有多少个素数满足n^3 + p*n^2 = m^3(其中n,m为大于1的自然数)

    解题思路:

    首先简化成n^2 *( n + p ) = m^3 

    假设 n^2 和 n+p 之间有公共素因子 p , 那么 n+p = k*p , 即 n=p*(k-1),

    带进去得到 p^3 * (k-1)^2 *k = m^3 , (k-1)^2*k 肯定是不能表示成某一个数的三次幂的,

    所以假设不成立,所以 n^2 和 n+p 之间没有公共素因子 p ,
     那么可以假设n=x^3 , n+p=y^3 , 相减得到 p = y^3 - x^3 = (y-x) *(y^2+y*x+x^2) ,  p是素数,
    所以 y-x=1 (这不用过多解释了吧,素数的因子只有1和P,右括号肯定是大于1的数了)

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 typedef long long ll;
     4 ll n, m;
     5 const int maxn = 1000000+10;
     6 int prime[maxn];
     7 bool is_prime[maxn];
     8 int sieve(int n)//返回n以内素数的个数
     9 {
    10     int p = 0;
    11     for(int i = 0; i <= n; i++)is_prime[i] = 1;
    12     is_prime[0] = is_prime[1] = 0;
    13     for(ll i = 2; i <= n; i++)
    14     {
    15         if(is_prime[i])
    16         {
    17             prime[p++] = i;
    18             for(ll j = i * i; j <= n; j += i)is_prime[j] = 0;//这里涉及i*i,必须使用long long
    19         }
    20     }
    21     return p;
    22 }
    23 int ans[maxn];
    24 int main()
    25 {
    26     sieve(1000000);
    27     for(int i = 1; ; i++)
    28     {
    29         int t = 3 * i * i + 3 * i + 1;
    30         if(t > 1000000)break;
    31         if(is_prime[t])ans[t] = 1;
    32     }
    33     for(int i = 1; i < maxn; i++)
    34         ans[i] += ans[i - 1];
    35     while(cin >> n)
    36         if(ans[n])cout<<ans[n]<<endl;
    37         else cout<<"No Special Prime!"<<endl;
    38     return 0;
    39 }
  • 相关阅读:
    pyinstaller安装和使用
    django项目结构和运行项目
    安装django and 创建项目
    浅谈网络请求基础(理论篇)
    浅谈爬虫初识
    判断是否AVL平衡二叉书
    用递归方法判断两棵树是否相等
    广度优先搜索求树的深度
    堆排序
    归并排序
  • 原文地址:https://www.cnblogs.com/fzl194/p/9033640.html
Copyright © 2011-2022 走看看