UVA106 - Fermat vs. Pythagoras

假设x为奇数,y为偶数,则z为奇数,2z与2x的最大公因数为2,2z和2x可分别写作

  • 2z = (z + x) + (z - x)
  • 2x = (z + x) - (z - x)

那么跟据最大公因数性质,z + x和z - x的最大公因数也为2,又因为:

  • (z + x)(z - x) = y2,两边同除以4得:
    ((z + x) / 2)((z - x) / 2) = (y / 2)2

故可令:

  • z + x = 2m2, z - x = 2n2
    其中z = m + n, x = m - n(m与n互质)

则有:

  • y2 = z2 - x2 = 2m22n2 = 4m2n2
    即y = 2mn。

综上所述,可得到下式:

  • x = m2 - n2, y = 2mn, z = m2 + n2. (m, n为任意自然数)

这里还有一个问题:题目要求统计(x, y, z)三元组的数量时只统计x,y和z两两互质的的情况,这个问题用上面的算法就可以解决了。但对于统计p的数量,题目并不限定三元组是两两互质的。但是上式不能生成所有x, y, z并不是两两互质的情况。然而假设x与y最大公因数w不为1,则z也必能被w整除,因此w为x, y, z三个数的公因数。归纳总结可知,所有非两两互质的x0, y0, z0都可由一组互质的x, y, z乘以系数得到。根据以上理论就可以快速的求解了。

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<cmath>
 4 #include<algorithm>
 5 #define MAX 1000010
 6 using namespace std;
 7 bool vis[MAX];
 8 int prime[MAX][3],n;
 9 int gcd(int a, int b)
10 {
11     return b == 0 ? a : gcd(b, a%b);
12 }
13 int upper(int l, int r, int v)
14 {
15     int m;
16     while (l < r)
17     {
18         m = l + (r - l) / 2;
19         if (prime[m][2] <= v) l = m + 1;
20         else r = m;
21     }
22     return r;
23 }
24 int cmp(const void*a, const void*b)
25 {
26     return ((int*)a)[2] - ((int*)b)[2];
27 }
28 int main()
29 {
30     int i,j,z,x,y,k=0;
31     int imax = int(sqrt(MAX >> 1)+0.5),jmax;
32     for (i = 1; i <= imax; i++)
33     {
34         jmax = int(sqrt(MAX - i*i) + 0.5);
35         for (j = i + 1; j <= jmax; j++)
36             if ((i & 1) + (j & 1 )== 1 && gcd(i, j) == 1)//(i&1)+(j&1)==1 一奇一偶
37             {
38                 y = 2 * i*j;
39                 z = i*i + j*j;
40                 x = j*j - i*i;
41                 if (x*x+y*y==z*z&&z<=1000000)
42                 {
43                     prime[k][0] = x;
44                     prime[k][1] = y;
45                     prime[k++][2] = z;
46                 }
47             }
48     }
49     qsort(prime,k,sizeof(prime[0]),cmp);
50     while (scanf("%d", &n) == 1)
51     {
52         int a = upper(0, k, n);
53         memset(vis, 0, n + 1);
54         for (i = 0; i < a; i++)
55             for (j = 1; j*prime[i][2] <= n; j++)
56             {
57                 vis[j*prime[i][0]] = 1;
58                 vis[j*prime[i][1]] = 1;
59                 vis[j*prime[i][2]] = 1;
60             }
61         int count = 0;
62         for (i = 1; i <= n; i++)
63             if (!vis[i]) count++;
64         printf("%d %d\n", a, count);
65     }
66     return 0;
67 }
View Code

 

转载于:https://www.cnblogs.com/cdyboke/p/4849428.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
智慧校园建设方案旨在通过融合先进技术,如物联网、大数据、人工智能等,实现校园的智能化管理与服务。政策的推动和技术的成熟为智慧校园的发展提供了基础。该方案强调了数据的重要性,提出通过数据的整合、开放和共享,构建产学研资用联动的服务体系,以促进校园的精细化治理。 智慧校园的核心建设任务包括数据标准体系和应用标准体系的建设,以及信息化安全与等级保护的实施。方案提出了一站式服务大厅和移动校园的概念,通过整合校内外资源,实现资源共享平台和产教融合就业平台的建设。此外,校园大脑的构建是实现智慧校园的关键,它涉及到数据中心化、数据资产化和数据业务化,以数据驱动业务自动化和智能化。 技术应用方面,方案提出了物联网平台、5G网络、人工智能平台等新技术的融合应用,以打造多场景融合的智慧校园大脑。这包括智慧教室、智慧实验室、智慧图书馆、智慧党建等多领域的智能化应用,旨在提升教学、科研、管理和服务的效率和质量。 在实施层面,智慧校园建设需要统筹规划和分步实施,确保项目的可行性和有效性。方案提出了主题梳理、场景梳理和数据梳理的方法,以及现有技术支持和项目分级的考虑,以指导智慧校园的建设。 最后,智慧校园建设的成功依赖于开放、协同和融合的组织建设。通过战略咨询、分步实施、生态建设和短板补充,可以构建符合学校特色的生态链,实现智慧校园的长远发展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值