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;
}