Advertisement

等差数列

阅读量:

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

在问题中,a是一个非负整數,b是正整數.設計一個程式來搜索S中的n項等差數列.

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

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

输出格式:
如果没有找到数列,输出`NONE’。

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

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

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

一个整数m=5;另一个整数n=7

复制代码
    #include<bits/stdc++.h>
    using namespace std;
    int n,m,c,cc,t,h;
    bool q[100001];
    struct A
    {
    	int a,b;
    }a[100001];
    bool cmpp(A a,A b)
    {
    	return a.b<b.b;
    }
    int main()
    {
    	cin>>n>>m;
     	for (int i=0;i<=m;i++)
     	{
     		for (int j=0;j<=m;j++)
     		  if (q[(i*i)+(j*j)]==0)
     	      {
     	      	q[(i*i)+(j*j)]=1;
    		   }	      	
    }//求双平方数集合
    	for (int i=0;i<=m*m*2;i++)
    	if (q[i])//判断是否在集合里面,作为等差数列的第一个数
    		 for (int j=i+1;j<=m*m*2;j++)
    		 if (q[j])//判断是否在集合里面,作为等差数列的第2个数
    	  {
    	  	 t=j-i;//公差
    	  	 if (t*(n-1)+i>m*m*2) break;//一个优化
    	  	 for (int k=t+i;k<t*(n-1)+i;k+=t)
    	  	 {
    	  	 	if (q[k+t]==0)
    	  	   {
    	  	   	t=0; break;
    		   }
    		 }	  	   
    		if (t!=0)
    	  {
    	  	 a[++cc].a=i; a[cc].b=t;
    	  }
    	  }
    	if (cc==0)
    	{
    		 cout<<"NONE";
        return 0;
    	  }  
    	sort (a+1,a+1+cc,cmpp); 
    	for (int i=1;i<=cc;i++)
    	{
    		 printf("%d %d\n",a[i].a,a[i].b);
    	}
    	return 0;
    }
    
    
    
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
    
    AI写代码

全部评论 (0)

还没有任何评论哟~