• USACO 1.4-Arithmetic Progressions


    /*
    ID: 1590291
    TASK: ariprog
    LANG: C++
    */
    #include <iostream>
    #include <fstream>
    #include <algorithm>
    #include <string.h>
    /******************************************************************************************************************
                    简直了,纯暴力!!!
                    一道吐血的暴力题!!!
                    好多坑啊,注释写清楚了,仔细回味回味就知道了。
                    思路:
                        1,巧用 f 数组来优化复杂度。
                        2,通过内外循环来求得公差 d,接着遍历看看是否存在 N 个数满足此首项公差公式
                        3,找到公差公式后,将 (首项a和公差b) 保存在 Node ans[70000]答案数组里.
    ******************************************************************************************************************/
    using namespace std;
    struct Node
    {
        int a;
        int b;
    };
    int f[700000],a[700000];      //为什么定义这么大就够了呢,因为有重复的。eg:66*66+77*77 = 77*77+66*66   标志数组
    Node ans[700000];
    
    bool cmp(Node x,Node y)
    {
        return x.b<y.b;
    }
    
    
    int main()
    {
        ifstream fin("ariprog.in");
        ofstream fout("ariprog.out");
    
        int N,M;
        while(fin>>N>>M)
        {
            memset(f,0,sizeof(f));
    
            int length=0,length1=0,flag;
            for(int i = 0;i <= M;i ++){
                for(int j = 0;j <= M;j ++){
                    f[i*i+j*j]=1;       //巧用数组标志 true 和 false,简化了许多算法
                }
            }
            for(int i = 0;i <= 2*M*M;i ++){
                if(f[i]){
                    a[length]=i;
                    length++;
                }
            }
            for(int i = 0;i < length;i ++){
                for(int j = i+1;j < length;j ++){
                    int d=a[j]-a[i];
                    flag=1;
                    if(a[i] + (N-1)*d > 2*M*M)  break;      //越界了
                    for(int k = 2;k < N;k ++){      //上边界越界了。长度为 N 的等差数列,最后一个数是 a+(n-1)*d!!!
                        if(f[a[i]+k*d] == 0)      //不属于双平方和数集合
                            flag=0;
                    }
                    if(flag){       //找到了长度为 N 的等差数列,保存在 Node 答案结构体里面
                        ans[length1].a=a[i];
                        ans[length1].b=d;
                        length1++;
                    }
                }
            }
            sort(ans,ans+length1,cmp);
            if(length1 == 0)
                fout<<"NONE"<<endl;
            else{
                for(int i = 0;i < length1;i ++)
                    fout<<ans[i].a<<" "<<ans[i].b<<endl;
            }
        }
        return 0;
    }
    


  • 相关阅读:
    一些Vim使用的小技巧
    virtualbox centos安装增强工具和Centos与VirtualBox共享文件夹设置
    (转) centos7 RPM包之rpm命令
    (转)Navicat_12安装与破解,亲测可用!!!
    (转)2019年 React 新手学习指南 – 从 React 学习线路图说开去
    (转)react 项目构建
    (转)python3:类方法,静态方法和实例方法以及应用场景
    (转)SQLAlchemy入门和进阶
    (转)面向对象(深入)|python描述器详解
    (转)CentOS 7.6 上编译安装httpd 2.4.38
  • 原文地址:https://www.cnblogs.com/Jstyle-continue/p/6352032.html
Copyright © 2020-2023  润新知