构造

前言

这是一类高自由度的题目,往往需要选手在找到简单的特解之后将其推广,并考虑问题规模增长对于答案的影响

练习

\(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 ...\)

posted @ 2025-10-21 20:24  FallingGardenia  阅读(1)  评论(0)    收藏  举报