首页 > 其他分享 >P3599题解

P3599题解

时间:2023-07-10 18:45:39浏览次数:46  
标签:前缀 int 题解 ll 构造 cdots P3599 我们

本题是一道比较典的构造题,拿来扩宽扩宽大家的眼界吧。

Task 1

试判断能否构造并构造一个长度为 \(n\) 的 \(1 \sim n\) 的排列,满足其 \(n\) 个前缀和在模 \(n\) 的意义下互不相同。

很容易想到的一点是:\(n\) 一定排在第一位,因为如果排在别的位,加上 \(n\) 后在模 \(n\) 意义下是不变的,因此不满足题意,只能放在第一位。

然后我们可能有一个朴素的想法:构造出的前缀和序列在模 \(n\) 意义下为 \(0,1,2,3,\cdots ,n\)。但是很显然,这是行不通的(做差分即可)。

但是当我们随便试试,我们也可以想到一种前缀和序列:\(0,1,-1,2,-2 \cdots\)。我们对它做个差分,就可以得到原序列为 \(0,1,-2,3,-4,\cdots\)。这很显然就是 \(n,1,n-2, 3, n-4, \cdots\)。这样就可以构造出来了!

但是还有一种情况,就是无解。我们考虑下当什么时候为无解,自己手玩几组样例就能发现:当 \(n\) 为除 \(1\) 以外的奇数时无解。

证明:

\[\sum \limits _{i=1}^{n-1} i = \frac{n(n-1)}{2} =kn\equiv 0(\bmod{n}) \]

这样我们就可以愉快的 AC 掉 Task 1 了。

Task 2

试判断能否构造并构造一个长度为 \(n\) 的 \(1 \sim n\) 的排列,满足其 \(n\) 个前缀积在模 \(n\) 的意义下互不相同。

很显然,\(n\) 应该放最后,因为如果前缀积中出现 \(n\) 后后面的前缀积一定全为 \(0\)。

我们先来判断无解:当 \(n\) 为大于 \(4\) 的合数时无解。


证明:

引理:当 \(n\) 为大于等于 \(4\) 的合数时,存在 \(a, b < n\) 且 \(ab \bmod n = 0\)

因此 \(\prod_{1}^{n-1}i \bmod n=0\)

所以不管我们怎么摆放前 \(n-1\) 个数,总是会出现 \(2\) 个 \(0\)(一个为 \(n\),一个为 \(ab\))。

所以当 \(n\) 为大于 \(4\) 的合数时无解。

引理的证明:

  1. 当 \(n=p_1^{a_1}p_2^{a_2}\cdots p_k^{a_k}\) 时,我们可以找到两个数 \(x=\prod_{i=1}^{z}p_i^{a_i},y=\prod_{i=z+1}^{k}p_i^{a_i}\) 满足 \(xy \bmod n = 0\)。
  2. 当 \(n=p^{k}(k>2)\) 时,我们可以找到 \(x=p^{a},y=p^{k-a}\) 满足要求。
  3. 当 \(n=p^2(p>2)\) 时,我们可以找到 \(x=p, y = 2p\),这时 \(n|xy\)。

得证。


有了上面的定理,我们就很好判断是否有解了。剩下的问题就是开始构造了。

我们通过一些手段(打表等)可以发现一个规律:前缀积为 \(1,2,3,\cdots\) 的方案一定能构造出来。我们就可以考虑这个方案。

不难发现按下面的方案构造就能出正解:

\[1,2, \frac{3}{2},\frac{4}{3},\frac{5}{4} \cdots \]

当 \(n\) 为 \(4\) 时,可以直接打表,当 \(n > 4\) 时,根据上面的无解方案,我们可以知道 \(n\) 一定为质数,我们就可以直接快速幂求逆元。

完整代码:

#define LOCAL
#include <bits/stdc++.h>

using namespace std;

typedef long long ll;
typedef pair<int, int> PII;

const int N = 1e6 + 10;
bitset<N> st;
int primes[N], cnt;
int a[N];
int type;

ll qmi(ll a, ll b, ll p)
{
    ll res = 1;
    while(b)
    {
        if(b & 1) res = res * a % p;
        a = a * a % p;
        b >>= 1;
    }
    return res;
}

void init(int n)
{
    for(int i = 2; i <= n; i ++ )
    {
        if(!st[i])
        {
            primes[++ cnt] = i;
        }
        for(int j = 1; primes[j] <= n / i; j ++ )
        {
            st[primes[j] * i] = true;
            if(i % primes[j] == 0) break;
        }
    }
}

int main()
{
    init(100001);
    st[4] = false;

    type = read();
    int T = read();

    while(T -- )
    {
        int n = read();
        if(type == 1)
        {
            if(n == 1)
            {
                puts("2 1");
                continue;
            }
            if(n & 1) puts("0");
            else
            {
                printf("2 ");
                for(int i = 0; i < n; i ++ )
                {
                    if(!(i & 1)) printf("%d ", n - i);
                    else printf("%d ", i);
                }
                puts("");
            }
        }
        else
        {
            if(st[n]) puts("0");
            else
            {
                printf("2 1 ");
                if(n == 4)
                {
                    printf("3 2 4\n");
                    continue;
                }
                for(int i = 2; i < n; i ++ )
                {
                    printf("%d ", (ll)i * qmi(i - 1, n - 2, n) % n);
                }
                printf("%d\n", n);
            }
        }
    }

    return 0;
}

标签:前缀,int,题解,ll,构造,cdots,P3599,我们
From: https://www.cnblogs.com/crimsonawa/p/17542001.html

相关文章

  • CF1421E题解
    题目链接本题作为一道本人思考了50分钟没想出来的大思维题,我觉得可以用来扩宽一下大家的视野。本题中,我们每次都会选取两个相邻的数\(a_i\)和\(a_{i+1}\),同时将这两位变为一位,这一位上填的数为\(-(a_i+a_{i+1})\)。很容易想到的一个\(O(n^3)\)的dp做法是区间dp,设\(f[......
  • NOIP2013-2023题解
    本文章主要是为了不想卷题的时候不是特别颓废而准备本文章是为了总结NOIP最近的题目(为了今年NOIP做准备),目前还没写完,尽量做的全面一些。2013积木大赛给定一个长度为\(n\)的序列\(h_i\),初始有一个全为\(0\)的序列,每次操作可以任意选择\(L,R\),使得\([L,R]\)这段区......
  • CF1545D-题解
    题目链接题目描述有\(n\)个人和\(k\)个间隔相同时间的时刻,每个人都向正方向做匀速直线运动。给出每个时刻(\(0\simk-1\))的所有人的坐标集合(无序),在这\(nk\)个数中有一个数是错误的,找出这个错误的数并将其改正。数据范围:\(5\len\le1000\),\(7\lek\le1000\)。加......
  • 【问题解决】docker login报错 org.freedesktop.Secret.Error.IsLocked: Cannot creat
    问题场景环境docker24.0.2社区版UbuntuServer18.04LTS刚刚执行dockerlogin登录仓库报错:hellxz@bigdata:~/dockerTest$dockerloginharbor.xxx.com.cnUsername:hellxzPassword:**Message:17:26:21.611:Remoteerrorfromsecretservice:org.freedesktop.Se......
  • CF1827D 题解
    problem&blog。很好的题。用到一些关于重心的trick。不妨认为只有一个重心\(\text{maxx}\)。设当前节点数为\(n\),重儿子所在的子树的大小为\(\text{maxsiz}\),那么答案即\(n-2\times\text{maxsiz}\),方法是往重儿子的那个子树爆加节点。因此需要在线维护\(\text{maxx}......
  • CF1601F Two Sorts 题解--zhengjun
    link这里提供一种不用meetinmiddle的方法,速度比较可观。发现性质开始简单的推一下式子。\(\sum(i-a_i)\bmodp=\sum(rk_i-i-p\times\lfloor\frac{rk_i-i}{p}\rfloor)=-p\times\sum\lfloor\frac{rk_i-i}{p}\rfloor,p=998244353\)于是,只需求出\(\sum\lfloor\frac{rk_i-......
  • C++题解——格子游戏
    题目链接:一本通TFLSOJ思路:使用并查集给点连接,如果在连接过程中遇到已连接的点二次连接,就输出代码:#include<bits/stdc++.h>usingnamespacestd;structnode{ intx,y;};nodef[205][205];intn,m;nodefind(nodek){ if(f[k.x][k.y].x==k.x&&f[k.x][k.y].y==k.y)retur......
  • Windows下安装python2和python3双版本及问题解决
    现在大家常用的桌面操作系统有:Windows、MacOS、ubuntu,其中MacOS和ubuntu上都会自带python。这里我们只介绍下Windows(我用的Win10)环境下的python2.x和python3.x的安装,以及python2.x与python3.x共存时的配置问题。本节内容python下载安装Python2.x安装Python3.x当前存......
  • 洛谷P1443:马的遍历--题解
    写在前面这是蒟蒻第一篇题解。作为一名没带脑子的初中生的第一篇题解,本题解必定存在诸多错误,给您带来的不便敬请谅解。对于不足之处与错误,还请多多包涵,并欢迎批评指正!本题目来自于洛谷,网址https://www.luogu.com.cn/problem/P1443。非营利性,侵权请联系删除。题目详情马的遍历......
  • Seata-server.bat闪退问题解决及Seata快速搭建
    转:Seata-server.bat闪退问题解决及Seata快速搭建 1.4上 部署的话 参考下边的地址:seata部署指南(v1.6.1) 启动seata服务前请先做好配置 ......