题意:让你算数a^2+b^2=c^2在n内全部(a, b, c) = 1的解得个数,和除去所有(a, b, c)能满足方程的数字个数。
思路:暴力会超时所以需要使用勾股定理:
设
m >
n 、
m 和
n 均是正整数,
a =
m
2 −
n
2,
b = 2
mn,
c =
m
2 +
n
2
——百度百科
枚举m,n即可。
在得到素数解之后在把所有解都标记一下。
代码如下:
1 /************************************************** 2 * Author : xiaohao Z 3 * Blog : http://www.cnblogs.com/shu-xiaohao/ 4 * Last modified : 2014-03-26 17:41 5 * Filename : uva_106.cpp 6 * Description : 7 * ************************************************/ 8 9 #include <iostream> 10 #include <cstdio> 11 #include <cstring> 12 #include <cstdlib> 13 #include <cmath> 14 #include <algorithm> 15 #include <queue> 16 #include <stack> 17 #include <vector> 18 #include <set> 19 #include <map> 20 #define MP(a, b) make_pair(a, b) 21 #define PB(a) push_back(a) 22 23 using namespace std; 24 typedef long long ll; 25 typedef pair<int, int> pii; 26 typedef pair<unsigned int,unsigned int> puu; 27 typedef pair<int, double> pid; 28 typedef pair<ll, int> pli; 29 typedef pair<int, ll> pil; 30 31 const int INF = 0x3f3f3f3f; 32 const double eps = 1E-6; 33 const int LEN = 1000000+10; 34 int f[LEN], top; 35 36 struct Pth{ 37 int p[3]; 38 }pt[LEN]; 39 40 Pth MPT(int a, int b, int c){ 41 Pth ret; 42 ret.p[0] = a, ret.p[1] = b, ret.p[2] = c; 43 sort(ret.p, ret.p+3); 44 return ret; 45 } 46 47 bool cmp(Pth a, Pth b){ 48 return a.p[2] < b.p[2]; 49 } 50 51 int main() 52 { 53 // freopen("in.txt", "r", stdin); 54 55 ll n; 56 while(cin >> n){ 57 memset(f, 0, sizeof f); 58 int cnt = 0, ans = 0; 59 for(ll i=1; i<=sqrt(n); i++){ 60 for(ll j=i+1; j<=sqrt(n); j++){ 61 if((i+j)%2 == 0 && __gcd(i, j) == 1) continue; 62 ll a = j*j - i*i, b = 2*i*j, c = i*i + j*j; 63 if(a*a + b*b == c*c && c <= n){ 64 if(__gcd(a, __gcd(b, c)) == 1){ 65 pt[cnt++] = MPT(a, b, c); 66 } 67 } 68 } 69 } 70 sort(pt, pt+cnt, cmp); 71 for(int i=0; i<cnt; i++){ 72 for(int j=1; j*pt[i].p[2] <=n; j++){ 73 for(int k=0; k<3; k++) { 74 f[j*pt[i].p[k]] = 1; 75 } 76 } 77 } 78 for(int i=1; i<=n; i++){ 79 if(!f[i]) ans++; 80 } 81 cout << cnt << ' ' << ans << endl; 82 } 83 return 0; 84 }