我们将所有能写成 p2+q2 (p,q>=0)的数字成为bisquare数,在bisquare集合中有多少长度为N(3<=N<=25)的等差序列?我们规定p,q的取值区间为[0,M](1<=M<=250),且等差序列的公差大于0。
我们很容易想到枚举序列中的前两项(或者首项和尾项,这正是我用的方法,这样便于剪枝)来确定整个序列并检验其余项是否是bisquare,但注意当M=250的时候bisquare集合中有20000多个数字,所以算法的复杂度要控制在o(n2)以内,这样检验是否是bisquare的步骤要用常数时间才行,这时候哈希表就派上用场了。
点击查看我的源代码:
/*
ID: *******
LANG: C
TASK: ariprog
*/
#include<stdio.h>
#include<stdlib.h>
int N,M;
FILE *fin,*fout;
typedef struct{
int first;
int diff;
}R;
R seq[10001];
int tailSeq;
int bisq[32000];
int tailBisq;
int hash[125001];
int cmpint(const void *a, const void *b){
return(*(int *)a-*(int *)b); //升序
}
int cmpR(const void *a, const void *b){//先按公差比较,再按首项比较
R aa=*(R*)a;
R bb=*(R*)b;
if(aa.diff==bb.diff){
return aa.first-bb.first;
}
return aa.diff-bb.diff;
}
int main(){
fin=fopen("ariprog.in","r");
fout=fopen("ariprog.out","w");
fscanf(fin,"%d %d",&N,&M);
int i,j;
for(i=0;i<125001;i++)hash[i]=0;
tailBisq=-1;
for(i=0;i<=M;i++){
for(j=i;j<=M;j++){
bisq[++tailBisq]=i*i+j*j;
hash[bisq[tailBisq]]=1;//哈希表记录某数字是否在bisquare数字集合中
}
}
qsort(bisq,tailBisq+1,sizeof(int),cmpint);
int count=0;
int pre=-1;
for(i=0;i<=tailBisq;i++){//排序后去重
if(bisq[i]!=pre){
bisq[count]=bisq[i];
count++;
pre=bisq[i];
}
}
tailBisq=count-1;
tailSeq=-1;
int first,last;
for(first=0;first<=tailBisq;first++){
for(last=first+N-1;last<=tailBisq;last++){//枚举首项和尾项
int diff=bisq[last]-bisq[first];
if(diff==0)continue;
if(diff%(N-1)!=0)continue;//剪枝
diff=diff/(N-1);
for(i=1;i<=N-2;i++)//查看中间项是否是bisquare数
if(hash[bisq[first]+diff*i]==0)
break;
if(i>N-2){//记录符合条件的等差序列
R r;
r.first=bisq[first];
r.diff=diff;
seq[++tailSeq]=r;
}
}
}
qsort(seq,tailSeq+1,sizeof(R),cmpR);
for(i=0;i<=tailSeq;i++){
fprintf(fout,"%d %d\n",seq[i].first,seq[i].diff);
}
if(tailSeq==-1)fprintf(fout,"NONE\n");
return 0;
}

2020年6月05日 16:30
The people with programming skills can grab here the useful update and get help by experts about coding as well. I admire your excellent help online and must recommend others to avail stuff while having it here. Thumbs up and keep going to bring useful material.
2021年4月02日 12:41
Great, this post is all about NCERT solutions for the students since this website provides us complete solutions for NCERT 11th class.
2023年4月28日 13:27
Thank you for posting this wonderful idea for my whats app status.