听灌佬多
  • 板块灌水区
  • 楼主stOstOkkkOrzOrz
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/10/29 15:23
  • 上次更新2024/10/29 19:24:31
查看原帖
听灌佬多
1406725
stOstOkkkOrzOrz楼主2024/10/29 15:23

题目传送门

#include<algorithm>
#include<iostream>
#include<map>
using namespace std;

long long n,a[10005],mn=1e15,cnt,sum=0;
map<int,bool> MP;
void go_to_check(int x){
	map<int,bool> mp;
	cnt=0;
	for(int i=1;i<=n;i++){
		if(!mp[a[i]%x]) cnt++;
		if(cnt>3) return;
		mp[a[i]%x]=true;
	}
//	cout<<x<<" ";
	sum+=x;
	if(!MP[x]){
//		cout<<"YES\n";
	} 
	else{
//		cout<<"NO\n";
		sum-=x;
	}
	MP[x]=true;
}
void go_work(int x){
	for(int i=1;i*i<x;i++){
		if(i>mn/4) break;
		if(x%i==0){
			go_to_check(i);
			go_to_check(x/i);
		}
	}
}
int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i];
		mn=min(mn,a[i]);
	}
//	mn=mn/4;
	sort(a+1,a+n+1);
    long long len=unique(a+1,a+1+n)-a-1;
    if(len<=3){
        cout<<1ll*(mn/4)*(mn/4+1)/2;
        return 0;
    }
//	cout<<a[1];
	go_work(abs(a[2]-a[1]));
	go_work(abs(a[3]-a[1]));
	go_work(abs(a[4]-a[1]));
	go_work(abs(a[3]-a[2]));
	go_work(abs(a[4]-a[2]));
	go_work(abs(a[4]-a[3]));
	cout<<sum;
	return 0;
}
/*
if最后暴力判断是用的 map,一定要记得每次清空
定义在全局的变量就不要在函数里再定义一次了。
用除法的时候脑子里一定要脑补取整符号
如果是按照正解思路打的,记得:
1.开 long long
2.判断因数是否小于等于 Min_a/4 即是否满足条件1
注意到 ai≤4×10^9...请不要将 minn 的初值设为 2147483647
*/

死亡证明

2024/10/29 15:23
加载中...