题目网址: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! "); else printf("%d ",ans); } return 0; }