Loading

7387. 【2021.11.16NOIP提高组联考】数析送命题

Description

\(\text{pty}\) 在数析课上学习了函数:

  • \(f: R \rightarrow R\)
  • \(\forall x \in R, f(x)=f(-x) \Leftrightarrow f\) 是偶函数。
  • \(\forall x \in R, f(x)=-f(-x) \Leftrightarrow f\) 是奇函数。
  • \(\forall x \in R, f(x)=f(x+T) \Leftrightarrow T\)\(f\) 的周期。
  • \(X(f)=\{T>0 \mid \forall x \in R, f(x)=f(x+T)\}\),定义 \(f\) 的最小正周期为 \(\min \{X(f)\}\)

\(\text{pty}\) 已经确定了 \(f\) 的若干条性质, 每条性质形如 \(f(x+A)\) 是偶函数或者 \(f(x+B)\) 是奇函数, 记 \(F=\{f \mid f\) 满足上述条件 \(\}\)

\(\text{pty}\) 想知道 \(f\) 的最小正周期的最大值, 即求 \(\max _{f \in F} \min \{X(f)\}\) 。 特殊地, 如果最大值可以无穷大或者不存在最小正周期, 输出 \(-1\)

Solution

考虑当只有偶函数时,可以推出对于两个函数 \(f(x+a)=f(-x+a)\)\(f(x+b)=f(-x+b)\) 的周期为 \(2(b-a)\)

只有奇函数同理。

将偶函数和奇函数放在一起考虑,依旧可以推出对于偶函数 \(f(x+a)=f(-x+a)\)\(f(x+b)=-f(-x+b)\) 的周期是 \(4(b-a)\)

具体过程本文不多说,想知道的可以点击这里:证明过程

那么接下来就很简单了,偶函数的答案为 \(ans=2\times \gcd_{i,j}(a_i-a_j)\),但不可能枚举 \(i,j\),转换式子变成 \(ans=2\times \gcd_j(a_1-a_j)\)

奇函数同理。然后把所有放在一起考虑,式子一样,只不过系数变成 4。

最后对 3 个答案再求一次 \(\gcd\),如果答案为 0 或 1 则无解,否则有解,注意输出绝对值。

Code

#include<cstdio>
#include<algorithm>
#define N 1000005
#define ll long long
using namespace std;
ll n,x,y,gcd1,gcd2,gcd3,ans,q1n,q2n,a[N],q1[N],q2[N];
int main()
{
	freopen("function.in","r",stdin);
	freopen("function.out","w",stdout);
	scanf("%lld",&n);
	for (int i=1;i<=n;++i)
	{
		scanf("%lld%lld",&x,&y);
		if (x==0) q1[++q1n]=y;
		else q2[++q2n]=y;
		a[i]=y;
	}
	for (int i=2;i<=q1n;++i)
		gcd1=__gcd(gcd1,q1[1]-q1[i]);
	for (int i=2;i<=q2n;++i)
		gcd2=__gcd(gcd2,q2[1]-q2[i]);
	for (int i=2;i<=n;++i)
		gcd3=__gcd(gcd3,a[1]-a[i]);
	gcd1*=2;gcd2*=2;gcd3*=4;
	ans=__gcd(__gcd(gcd1,gcd2),gcd3);
	if (ans==0||ans==1||ans==-1) printf("-1\n");
	else printf("%lld\n",abs(ans));
	return 0;
}
posted @ 2021-11-16 21:42  Thunder_S  阅读(59)  评论(0编辑  收藏  举报