题目

题目描述

一个等差数列是一个能表示成a, a+b, a+2b,..., a+nb (n=0,1,2,3,...)的数列。

在这个问题中a是一个非负的整数,b是正整数。写一个程序来找出在双平方数集合(双平方数集合是所有能表示成p的平方 + q的平方的数的集合,其中p和q为非负整数)S中长度为n的等差数列。

输入输出格式

输入格式:

第一行: N(3<= N<=25),要找的等差数列的长度。

第二行: M(1<= M<=250),搜索双平方数的上界0 <= p,q <= M。

输出格式:

如果没有找到数列,输出`NONE'。

如果找到了,输出一行或多行, 每行由二个整数组成:a,b。

这些行应该先按b排序再按a排序。

所求的等差数列将不会多于10,000个。

输入输出样例

输入样例#1:

5
7

输出样例#1:

1 4
37 4
2 8
29 8
1 12
5 12
13 12
17 12
5 20
2 24

题目大意

  题目刚开始我也看不懂

后来懂了。。。

其实就是在一个数列里找到长度为n的等差数列

这个数列是(0到m)平方加上 (0到m)平方形成的所有的数

输出第一个数的数值和公差即可

分析

首先,当然是构建数列啦

然后我们就要找等差数列啦

等差数列从何入手呢?

等差数列顾名思义是有一个公差的

我们只需要枚举公差就好了

于是我们通过枚举前两的在等差数列的数得到公差后

向后查找其他数

最后如果所有数存在就可以算一种了

排序 就可以输出啦

还有一个要注意的:

一个很重要的优化点

当数很多,公差很大时

显然超时

所以我们在查找前要加判断

当  第一个数+(n-2)*公差>最大值时 break

因为是有序的,当出现第一个大于最大值时,后面都不行

代码

 1 #include<iostream>
 2 #include<algorithm>
 3 using namespace std;
 4 int a[62500000],b[62500000];
 5 struct sb
 6 {
 7     int shu,cha;
 8 }ans[600000];
 9 bool cmp(sb a,sb b)
10 {
11     if (a.cha<b.cha) return true;
12     if (a.cha==b.cha)
13       if (a.shu<b.shu) return true;
14     return false;
15 }
16 int main ()
17 {
18     int n,m;
19     cin>>n>>m;
20     int k=1;
21     for (int i=0;i<=m;i++)  // 得到数列
22        for (int j=i;j<=m;j++)
23        {
24             a[i*i+j*j]=1;
25             b[k++]=i*i+j*j;
26        }
27     sort(b+1,b+1+k);  //排序
28     int wz=unique(b+1,b+1+k)-b; //因为会有重复,所以去重
29     k=1;
30     for (int i=1;i<=wz;i++)
31     {
32         for (int j=i+1;j<=wz;j++)
33         {
34             int ca=b[j]-b[i],bj=0;
35             if (ca<=0) continue;
36             if (b[j]+(n-2)*ca>2*m*m) break;  //优化
37             for (int ii=1;ii<=n-2;ii++)
38             {
39                 if (a[b[j]+ii*ca]!=1)
40                 {
41                     bj=1;
42                     break;
43                 }
44             }
45             if (bj==0) {
46                 ans[k].shu=b[i];
47                 ans[k].cha=ca;
48                 k++;
49             }
50         }
51     }
52     sort(ans+1,ans+1+k,cmp);  //排序输出
53     if (k<2) cout<<"NONE";
54     for (int i=2;i<=k;i++)
55       cout<<ans[i].shu<<" "<<ans[i].cha<<endl;
56 }

转载于:https://www.cnblogs.com/zjzjzj/p/10085450.html

[USACO1.4]等差数列 Arithmetic Progressions相关推荐

  1. 2020牛客国庆集训派对day4 Arithmetic Progressions

    Arithmetic Progressions 链接:https://ac.nowcoder.com/acm/contest/7831/B 来源:牛客网 题目描述 An arithmetic prog ...

  2. Arithmetic Progressions

    一.问题 An arithmetic progression is a sequence of numbers a_1, a_2, . . . , a_ka1​,a2​,...,ak​ where t ...

  3. usaco Arithmetic Progressions

    题意:给出n,m,其中n表示等差数列的长度,每项由a^2+b^2表示,其中a和b不超过m,要求输出满足条件的首项及等差 思路:先根据m,可以得到由[0,m]构成的a^2+b^2,最大的等差,然后根据首 ...

  4. USACO-Section1.5 Arithmetic Progressions(枚举)

    2017-6-7 题目描述 求出满足条件的等差数列的首项和公差 解答 枚举法 代码 /* ID: 18795871 PROG: ariprog LANG: C++ */ #include<ios ...

  5. usaco Arithmetic Progressions(看了题解)

    usaco也开始限时了,这题是搜索加剪枝.剪枝很关键.(哎........怎么才能不看题解解题啊) /* ID: jinbo wu LANG: C++ TASK: ariprog */ #includ ...

  6. POJ3006-Dirichlet's Theorem on Arithmetic Progressions

    素数打表,水题. #include<stdio.h> #include<string.h> const int Max=1000001; bool isprime[Max]; ...

  7. 【CC November Challenge 2012】Arithmetic Progressions【分块】【FFT】

    题意:给定长度为 nnn 的正整数序列 AAA,求满足 i<j<k,Aj−Ai=Ak−Aji<j<k,A_j-A_i=A_k-A_ji<j<k,Aj​−Ai​=Ak ...

  8. 1.4 Arithmetic Progressions

    3个优化就可以过了...预处理所有bisquare并排序,以及一个bool数组判断是否有某个bisquare 我的思路是先b后a... 1.要满足有N个数  b <= MAXNUM/N 2.a ...

  9. usaco题思考记录

    1. 修理牛棚 Barn Repair 思路:反向,枚举所有间隔,从大到小排序,依次+板子不填它,直到板子数够了为止,拿总长去减::: 结论:逆向思维. 2.丢失的牛 思路:BFS::: 结论:有后效 ...

最新文章

  1. 【Java工具类】使用Random类对象生成随机整数
  2. CISCO 2511终端服务器配置
  3. Linux下mysql新建账号及权限设置
  4. python最新面试题_2018年最新Python面试题及答案
  5. Android wifi ADB的使用
  6. 打破云原生时代存储瓶颈,SmartX 发布 K8s 云原生存储 IOMesh
  7. C#.Net工作笔记014---C#中internal的意思
  8. [jQuery] 速记一の屏蔽鼠标右键监听鼠标Event
  9. C#中Dictionary的用法及用途(转)
  10. 2010nbsp;贱语大全!
  11. i.MX6ULL终结者Linux RS232/485驱动实验RS232驱动
  12. C语言构建连连看游戏(矩阵方式)
  13. shell编程三大神器之grep
  14. InfluxDB查询 tag和field列名字重复
  15. GPU卡的主流调度平台
  16. win10系统盘多大合适_不会安装win10原版系统?3招教你轻松学会重装系统,超详细教程...
  17. 更换固态,重装win10系统
  18. js 中文加密解密
  19. guid分区怎么装win7_如何在GUID分区装win7系统并以UEFI启动?
  20. 交流电计算方法c语言,正弦交流电的计算公式

热门文章

  1. 可爱的特殊字符集收集
  2. DHCP中继以及DHCP数据库的备份和还原
  3. kubernetes集群命令行工具kubectl
  4. vue 路由相关操作
  5. 易语言 精易模块 操作json数据
  6. ACDSee Photo Studio Ultimate 2020中文版
  7. 【Spring框架家族】Spring--Security权限控制密码加密
  8. Discuz!UCenter创始人密码重置方法
  9. 通过反射获取类上的注解
  10. Centos7.5.1804永久生效修改主机名