2017-6-7
题目描述
求出满足条件的等差数列的首项和公差
解答
枚举法
代码
/*
ID: 18795871
PROG: ariprog
LANG: C++
*/
#include<iostream>
#include<cstdlib>
#include<fstream>
using namespace std;
ifstream fin("ariprog.in");
ofstream fout("ariprog.out");
const int N=125000;
bool f[N+1];
struct sl{
int a,b;
}x[10001];
int m,n,r=0;
int cmp(const void *a,const void *b){
struct sl *k1=(struct sl *)a;
struct sl *k2=(struct sl *)b;
if (k1->b==k2->b) return k1->a-k2->a;
else return k1->b-k2->b;
}
void init(){
int i,j;
for (i=0;i<=m;i++){
for (j=i;j<=m;j++){
f[i*i+j*j]=true;
}
}
}
void res(){
int i,j;
for (i=0;i<=2*m*m;i++){
if (!f[i]) continue;
for (j=1;j<=2*m*m/(n-1);j++){
if (i+j>2*m*m||!f[i+j]) continue;
if (i+j*2>2*m*m||!f[i+j*2]) continue;
if (i+j*(n-1)>2*m*m||!f[i+j*(n-1)]) continue;
int cnt=3;
while (cnt<n){
if (!f[i+cnt*j]) break;
cnt++;
}
if (cnt==n){
x[r].a=i;
x[r].b=j;
r++;
}
}
}
}
int main(){
fin>>n>>m;
init();
res();
if (r==0) fout<<"NONE"<<endl;
else{
qsort(x,r,sizeof(x[1]),cmp);
for (int i=0;i<r;i++){
fout<<x[i].a<<" "<<x[i].b<<endl;
}
}
return 0;
}
感觉和今年参加的蓝桥杯的一道填空题有点类似,有几点需要注意的地方:
1.首项,每个元素都要满足p^2+q^2。
2.在给f赋值的时候j,为了避免重复赋值,j要从i开始。
3.一开始写的时候超时,后来对j的范围进行约束即可。
/*
ID: 18795871
PROG: ariprog
LANG: C++
*/
#include<iostream>
#include<cstring>
#include<fstream>
using namespace std;
ifstream fin("ariprog.in");
ofstream fout("ariprog.out");
const int N=125000;
bool f[N+1];
int n,m;
int main(){
int i,j,k,s;
bool flag;
while (fin>>n>>m){
memset(f,false,sizeof(f));
for (i=0;i<=m;i++){
for (j=i;j<=m;j++){
f[i*i+j*j]=true;
}
}
flag=false;
for (i=1;i<=(2*m*m)/(n-1);i++){
for (j=0;j+(n-1)*i<=(2*m*m);j++){
if (!f[j]) continue;
s=0;
for (k=j;k<=(2*m*m);k+=i){
if (!f[k]) break;
else s++;
if (s==n){
flag=true;
fout<<j<<" "<<i<<endl;
break;
}
}
}
}
if (!flag) fout<<"NONE"<<endl;
}
return 0;
}