現在的位置: 首頁 > 綜合 > 正文

zju 2839 Find the Sequences

2014年02月12日 ⁄ 綜合 ⁄ 共 1751字 ⁄ 字號 評論關閉
先算出p^3+q^3的所有的數,然後排序.同時為了加快後面的查詢,建立一個hash表.然後從頭開始枚舉每個數列的前2項,得到a和b,再判斷後面的幾項.要注意的一點就是數列可能會超過p^3+q^3的最大值.
#include<iostream>
#include 
<string>
#include 
<algorithm>
using namespace std;
typedef 
struct  
{
    
int a, b;
}
Point;
Point p[
1000];
int num;
bool comp(Point p1, Point p2)
{
    
if(p1.b!=p2.b)
        
return  p1.b < p2.b;
    
else
        
return p1.a < p2.a;    
}

int hash[300000];
int main()
{
    
int i, j, k;
    
int n, m, cnt,cas=0,temp;
    
int a[30000];
    
int flag = false;
    
while (cin >> n >> m)
    
{
        
if(n==0 && m==0)
            
break;
        
if(!flag)
            flag 
= true;
        
else
            cout 
<< endl;
        cnt 
= 0;
        memset(hash, 
0sizeof(hash));
        
for (i=0; i<=m; ++i)
        
{
            
for (j=0; j<=m; ++j)
            
{
                temp 
= i*i*i+j*j*j;
                
if(!hash[temp])
                
{
                    hash[temp] 
= 1;
                    a[cnt
++= temp;
                }

            }

        }

        num 
= 0;
        
int aa, bb;
        sort(a, a
+cnt);
        
for (i=0; i<cnt; ++i)
        
{
            
for (j=i+1; j<cnt; ++j)
            
{
                aa 
= a[i];
                bb 
= a[j] - a[i];
                
for (k=3;k<=n;++k)
                
{
                    
int tte = aa+(k-1)*bb;
                    
if(tte>a[cnt-1|| !hash[tte])
                        
break;
                }

                
if(k > n)
                    p[num].a 
= aa, p[num++].b = bb;
            }

        }

        cout 
<< "Case "<<++cas <<":"<< endl;
        
if(!num)
        
{
            cout 
<< "NONE" << endl;
            
continue;
        }

        sort(p, p
+num, comp);
        
for (i=0; i<num; ++i)
        
{
            cout 
<< p[i].a << " " << p[i].b << endl;
        }


    }

    
return 0;
}
 

抱歉!評論已關閉.