构造
前言
这是一类高自由度的题目,往往需要选手在找到简单的特解之后将其推广,并考虑问题规模增长对于答案的影响
练习
\(T1:\) \(Vladik and fractions\)
题意
对于给定的整数 \(n\),找到一组解 \((x,y,z)\),使 \(\frac{1}{x} + \frac{1}{y} + \frac{1}{z} = \frac{2}{n}\)。
样例
Input
3
Output
2 7 42
Input
7
Output
7 8 56
分析
由样例二不难注意到,\(n,(n+1),n(n+1)\) 是一组解,特别地,当 \(n=1\) 时无解。
Code
#include<iostream>
#define IOS ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
using namespace std;
int n;
int main()
{
IOS;
cin>>n;
if(n==1)
cout<<-1<<'\n';
else
cout<<n<<' '<<n+1<<' '<<n*(n+1)<<'\n';
return 0;
}
\(T2:\) \(P3599 Koishi Loves Construction\)
题意
\(Task1\):判断能否构造并构造一个长度为 \(n\) 的 \(1...n\) 的排列,使其前缀和在模 \(n\) 意义下互不相同。
\(Task2\):判断能否构造并构造一个长度为 \(n\) 的 \(1...n\) 的排列,使其前缀积在模 \(n\) 意义下互不相同。
样例
Input
1 1
8
Output
2 8 7 6 5 4 3 2 1
Input
2 1
11
Output
2 1 2 3 5 10 6 7 4 9 8 11
分析
\(Task1\):
由尝试猜测 \(n = 2k + 1,k \in Z\) 时无解。
同时注意到 \(n\) 必须为排列的首项,否则记 \(\sigma_i\) 为排列的第 \(i\) 项,其中 \(\sigma_p = n\),有 \(\Sigma_{i=1}^{p-1}\sigma_i \equiv \Sigma_{i=1}^p\sigma_i \pmod{n}\)。
此时再证猜测,有 \(\Sigma_{i=2}^n\sigma_i = \frac{n(n-1)}{2} \equiv 0 \pmod{n}\),显然 \(\Sigma_{i=1}^{n-1}\sigma_i \equiv \Sigma_{i=1}^n\sigma_i \pmod{n}\)。
考虑构造前缀和序列再通过差分的方式获取原序列,那么前缀和序列两两之差就不能在模意义下相同,尝试模意义下的前缀和序列为 \(0,1,-1,2,-2,3 ...\) 发现这个序列恰好满足要求,那么原序列就是 \(n,1,n-1,2,n-2,3 ...\)。
浙公网安备 33010602011771号