NOI 1840:Eqs

题目

http://bailian.openjudge.cn/practice/1840/

思路

把等式右移三项,遍历左边的两项可能的取值用 map 存下来,遍历右边值而后从map中取出对应个数相加

源码

//
//  1840.cpp
//  test
//
//  Created by bytedance on 2020/9/8.
//  Copyright © 2020 bytedance. All rights reserved.
//

#include <stdio.h>
#include <iostream>
#include <map>
#include <math.h>
using namespace std;

int main(){
    int cnt = 0;
    map<int,int> m;
    int a1,a2,a3,a4,a5;
    cin >> a1>>a2>>a3>>a4>>a5;
    for(int i = -50;i <= 50;++i){
        int res1 = i*i*i*a1;
        for(int j = -50;j <= 50;++j){
            int res = res1+j*j*j*a2;
            if(i==0||j==0)continue;
            if(m.find(res)!=m.end()){
                m[res]++;
            }else{
                m[res] = 1;
            }

        }
    }
    //    for(map<int,int>::iterator it = m.begin();it!=m.end();++it){
    //        cout <<it->first<<" "<<it->second<<endl;
    //    }

    for(int i = -50;i <= 50;++i){
        for(int j = -50;j <=50;++j){
            for(int k = -50;k <= 50;++k){
                if(i==0||j==0||k==0)continue;
                int res = i*i*i*a3+j*j*j*a4+k*k*k*a5;
                res = -res;
                if(m.find(res)!=m.end()){
                    cnt+=m[res];
                }
            }
        }
    }
    cout << cnt;
    return 0;
}
发布于 :NOI

发表评论

电子邮件地址不会被公开。 必填项已用*标注