USACO-Section1.4 Arithmetic Progressions [枚举]

18 篇文章 0 订阅

2017-6-2

题目大意

一个等差数列是一个能表示成a, a+b, a+2b,…, a+nb (n=0,1,2,3,…)的数列。
在这个问题中a是一个非负的整数,b是正整数。写一个程序来找出在双平方数集合(双平方数集合是所有能表示成p的平方 + q的平方的数的集合,其中p和q为非负整数)S中长度为n的等差数列。

题解

枚举公差d,然后枚举a,判断是否能连成n项的等差数列

代码

/*
ID: zachery1
PROG: ariprog
LANG: C++
*/
#include <iostream>
#include <fstream>
#include <algorithm>
#include <cstring>
#define MAXM2 180000 
#define cin fin
#define cout fout
using namespace std;
ifstream fin("ariprog.in");
ofstream fout("ariprog.out");

bool f[MAXM2];
int seq[MAXM2], q = 0;
int n, m;

int main() {
    cin >> n >> m;
    memset(f, false, sizeof(f));
    memset(seq, 0, sizeof(seq));
    for (int i = 0; i <= m; i++) {
        for (int j = i; j <= m; j++) {
            f[i*i + j*j] = true;
        }
    }
    for (int i = 0; i < 2*m*m; i++) {
        if (f[i]) {
            seq[q++] = i;
        } 
    }

    bool none = true;
    int endb = (2*m*m) / (n-1);
    for (int b = 1; b <= endb; b++) {//枚举公差b
        for (int i = 0; i < q; i++) {
            int a = seq[i];//枚举a
            bool flag = true;
            for (int k = 0; k < n; k++) {
                if (a+k*b > 2*m*m || !f[a+k*b]) {
                    flag = false;
                    break;
                }
            }
            if (flag) {
                cout << a << " " << b << endl;
                none = false;
            }
        }
    }
    if (none) cout << "NONE" << endl;
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值