[USACO1.4]等差数列 Arithmetic Progressions
题目
题目描述
一个等差数列是一个能表示成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个。
输入输出样例
5 7
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相关推荐
- 2020牛客国庆集训派对day4 Arithmetic Progressions
Arithmetic Progressions 链接:https://ac.nowcoder.com/acm/contest/7831/B 来源:牛客网 题目描述 An arithmetic prog ...
- Arithmetic Progressions
一.问题 An arithmetic progression is a sequence of numbers a_1, a_2, . . . , a_ka1,a2,...,ak where t ...
- usaco Arithmetic Progressions
题意:给出n,m,其中n表示等差数列的长度,每项由a^2+b^2表示,其中a和b不超过m,要求输出满足条件的首项及等差 思路:先根据m,可以得到由[0,m]构成的a^2+b^2,最大的等差,然后根据首 ...
- USACO-Section1.5 Arithmetic Progressions(枚举)
2017-6-7 题目描述 求出满足条件的等差数列的首项和公差 解答 枚举法 代码 /* ID: 18795871 PROG: ariprog LANG: C++ */ #include<ios ...
- usaco Arithmetic Progressions(看了题解)
usaco也开始限时了,这题是搜索加剪枝.剪枝很关键.(哎........怎么才能不看题解解题啊) /* ID: jinbo wu LANG: C++ TASK: ariprog */ #includ ...
- POJ3006-Dirichlet's Theorem on Arithmetic Progressions
素数打表,水题. #include<stdio.h> #include<string.h> const int Max=1000001; bool isprime[Max]; ...
- 【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 ...
- 1.4 Arithmetic Progressions
3个优化就可以过了...预处理所有bisquare并排序,以及一个bool数组判断是否有某个bisquare 我的思路是先b后a... 1.要满足有N个数 b <= MAXNUM/N 2.a ...
- usaco题思考记录
1. 修理牛棚 Barn Repair 思路:反向,枚举所有间隔,从大到小排序,依次+板子不填它,直到板子数够了为止,拿总长去减::: 结论:逆向思维. 2.丢失的牛 思路:BFS::: 结论:有后效 ...
最新文章
- 【Java工具类】使用Random类对象生成随机整数
- CISCO 2511终端服务器配置
- Linux下mysql新建账号及权限设置
- python最新面试题_2018年最新Python面试题及答案
- Android wifi ADB的使用
- 打破云原生时代存储瓶颈,SmartX 发布 K8s 云原生存储 IOMesh
- C#.Net工作笔记014---C#中internal的意思
- [jQuery] 速记一の屏蔽鼠标右键监听鼠标Event
- C#中Dictionary的用法及用途(转)
- 2010nbsp;贱语大全!
- i.MX6ULL终结者Linux RS232/485驱动实验RS232驱动
- C语言构建连连看游戏(矩阵方式)
- shell编程三大神器之grep
- InfluxDB查询 tag和field列名字重复
- GPU卡的主流调度平台
- win10系统盘多大合适_不会安装win10原版系统?3招教你轻松学会重装系统,超详细教程...
- 更换固态,重装win10系统
- js 中文加密解密
- guid分区怎么装win7_如何在GUID分区装win7系统并以UEFI启动?
- 交流电计算方法c语言,正弦交流电的计算公式