【枚举+数学】代码源每日一题div2 数学

数学 - 题目 - Daimayuan Online Judge

题意:

【枚举+数学】代码源每日一题div2 数学_第1张图片

思路:

首先把条件理一下

gcd(s1,s2)=K

按照惯用套路

s1=k1*K

s2=k2*K

那么就是(k1+k2)*K=sum

所以K是sum的一个因子

因此只需要枚举sum的因子即可

但是注意数据范围:1e9

说明不能直接枚举,怎么办呢

注意到还有个条件我们没有利用:数列是1~N的

这意味着sum=(N+1)*N/2

也就是说我们要枚举(N+1)*N/2的因子,其实就是找出它的最大因子

那么只需要分开枚举即可,然后求一下最大值*次大值 和 次大值*最大值 的 最大值

Code:

#include 

#define int long long

using namespace std;

using i64 = long long;

const int mxn=1e5+10;

int N,u,v;

void solve(){
	cin>>N;
	if(N%2==1) u=N,v=(N+1)/2;
	else u=N/2,v=N+1;
	priority_queue Q,Q2;
	for(int i=1;i<=u/i;i++){
		if(u%i==0){
			Q.push(i);
			if(i!=u/i) Q.push(u/i);
		}
	}
	int mx1=Q.top();
	Q.pop();
	int mxx1=Q.top();
	for(int i=1;i<=v/i;i++){
		if(v%i==0){
			Q2.push(i);
			if(i!=v/i) Q2.push(v/i);
		}
	}
	int mx2=Q2.top();
	Q2.pop();
	int mxx2=Q2.top();
	cout<>__;
    while(__--)solve();return 0;
}

你可能感兴趣的:(代码源每日一题,数学,枚举,算法)