[USACO1.4] Arithmetic Progressions

定义双平方数为可以表示为两个自然数的平方和的数。要求找出双平方数集合中的所有等差数列。给定 \(n\) 为数列长度,\(m\)\(p^2+q^2\)\(p,q\) 的上界

Solution

首先筛出所有双平方数,然后枚举数列的第一项和第二项,暴力判断即可

复杂度为 \(O(n\alpha(m^2)^2)\)

#include <bits/stdc++.h>
using namespace std;

int n,m,isp[1000005];

struct pii {
    int x,y;
    bool operator < (const pii &b) const {
        if(y==b.y) return x<b.x;
        return y<b.y;
    }
};

vector <pii> v;

signed main() {
    ios::sync_with_stdio(false);
    cin>>n>>m;
    for(int i=0;i<=m;i++) {
        for(int j=0;j<=m;j++) {
            isp[i*i+j*j]=1;
        }
    }
    for(int i=0;i<=2*m*m;i++) {
        if(isp[i]==0) continue;
        for(int j=i+1;j<=min(2*m*m,4*m*m/n+i);j++) {
            if(isp[j]==0) continue;
            int d=j-i;
            int mx=i+(n-1)*d;
            if(mx>2*m*m) break;
            int flag=1;
            for(int k=3;k<=n;k++) {
                int x=i+k*d-d;
                if(isp[x]==0) {
                    flag=0;
                    break;
                }
            }
            if(flag) v.push_back({i,d});
        }
    }
    sort(v.begin(),v.end());
    for(pii p:v) cout<<p.x<<" "<<p.y<<endl;
    if(v.begin()==v.end()) cout<<"NONE"<<endl;
}

猜你喜欢

转载自www.cnblogs.com/mollnn/p/12486300.html
今日推荐