usaco Arithmetic Progressions
2015-08-28 15:20
295 查看
这道题目还是理解了很久的,英语烂真是头大。
题意是,求长度为N,且每个元素都是双平方数(双平方数是指一个数能被写成其他两个数的平方相加)的等比数列的个数。
给出长度N,和平方数的范围(两数q,p各小于M;也就是双平方数小于2*M*M)
暴搜+简单剪枝
题意是,求长度为N,且每个元素都是双平方数(双平方数是指一个数能被写成其他两个数的平方相加)的等比数列的个数。
给出长度N,和平方数的范围(两数q,p各小于M;也就是双平方数小于2*M*M)
暴搜+简单剪枝
/* ID: modengd1 PROG: ariprog LANG: C++ */ #include <iostream> #include <stdio.h> #include <queue> #include <memory.h> using namespace std; bool isBis[2*251*251]; int N,M; struct node { int a,b; node(int aa,int bb) { a=aa; b=bb; } node(){} bool friend operator<(node n1,node n2) { if(n1.b==n2.b) return n1.a>n2.a; else return n1.b>n2.b; } }; void Init() { memset(isBis,false,sizeof(isBis)); for(int i=0;i<=M;i++) { for(int j=0;j<=M;j++) { isBis[i*i+j*j]=true; } } } bool islegal(int a,int b) { if(!isBis[a+b*(N-1)]) return false; for(int i=0;i<N;i++) { if(!isBis[a]) return false; a+=b; } return true; } int main() { freopen("ariprog.in","r",stdin); freopen("ariprog.out","w",stdout); int ans=0; priority_queue<node> Q; scanf("%d",&N); scanf("%d",&M); Init(); for(int i=0;i<=M*M;i++) { for(int j=1;j<=M*M;j++) { if((i+(N-1)*j)>2*M*M)//简单剪枝 break; if(islegal(i,j)) { ans++; Q.push(node(i,j)); } } } if(Q.empty()) cout<<"NONE"<<endl; else while(!Q.empty()) { node now=Q.top(); Q.pop(); cout<<now.a<<' '<<now.b<<endl; } return 0; }
相关文章推荐
- iPhone屏幕尺寸、分辨率及适配
- HTTP 错误 500.19- Internal Server Error 错误解决方法
- 配置Tomcat使用https协议(配置SSL协议)
- javaMail-入门
- 5.网络基础配置
- html的语法 源码
- 在线人数统计
- Android Fragment——处理Fragment生命周期
- 单例之懒汉式和饿汉式
- 4.容器中管理数据
- python监控windows的CPU,Memory,Disk
- 常用的OpenCV函数速查
- [刷题]Nth to Last Node in List
- linux shell if 参数
- 利用redis + lua解决抢红包高并发的问题
- hackerrank:Palindrome Index(hash)
- java源码查看工具之Source Insight
- CSS3:固定textarea文本域宽度
- 手机网站和电脑网站设计是需注意的区别
- 3.仓库