P3599 Koishi Loves Construction——构造题
题目
Task1:试判断能否构造并构造一个长度 $n$ 的 $1...n$ 的排列,满足其 $n$ 个前缀和在模 $n$ 的意义下互不相同
Task2:试判断能否构造并构造一个长度 $n$ 的 $1...n$ 的排列,满足其 $n$ 个前缀积在模 $n$ 的意义下互不相同。
分析
既然考虑原数列很难,就直接考虑前缀和和前缀积。
对于task1:
在模 $n$ 意义下,$\{1,2,3,...n\}$ 等价于 $ \{0,1,-1,2,-2,... \}$,我们将它设为前缀和。
其次,我们可以发现 $n$ 必定出现在数列的第一位,否则 $n$ 出现前后的两个前缀和会相等。已知首项,已知前缀和,就可以推出各项。奇数不行。
总结:
当 $n$ 为奇数时,无法构造出合法解(1特判)
当 $n$ 为偶数时,可以构成形如 $n, n-1, 2, n-3, 4...$ 这样的数列
对于Task2:
根据消元法,构造数列 $1,\frac{2}{1},\frac{3}{2},...,\frac{n-1}{n-2}$。
显然,合数没有解,因为其两个两个因子相乘之后,后面取模都为0了。
显然,首项为1,末项为n。
只需证明中间那些数是互不相同的。因为 $\frac{k+1}{k} = 1 + \frac{1}{k}$,当 $n$为质数时,每个元素都有逆元且不相同。
总结:
当 $n$ 为合数,无法构造出合法解(特判4)
当 $n$ 为质数,可以构造形如 $1,\frac{2}{1},\frac{3}{2},...,\frac{n-1}{n-2},n$.(特判1)
注意开 long long!!!
#include<bits/stdc++.h>
using namespace std; typedef long long ll;
const int maxn = + ;
int task, T;
int n; void solve1()
{
if(n == )
{
printf("2 1\n");
return;
}
if(n&)
{
printf("0\n");
return;
}
printf("2 %d ", n);
ll pre = ;
//printf("n:%d\n", n);
for(int i = ;i < n;i++)
{
int tmp = ((i&) == ? : -) * ((i+) / ); //printf("tmp: %d\n", tmp);
printf("%d", (tmp -pre+n)%n);
if(i == n-) printf("\n");
else printf(" ");
pre = tmp;
}
} bool is_prime[maxn + ];
void sieve(int n)
{
int m = (int)sqrt(n + 0.5);
memset(is_prime, true, sizeof(is_prime));
is_prime[] = is_prime[] = false; //1是特例
for (int i = ; i <= m; i++) if (is_prime[i])
for (int j = i * i; j <= n; j += i) is_prime[j] = false;
} int inv[maxn];
void init_inv(int n, int mod)
{
inv[] = ;
for(int i = ;i < n;i++) inv[i] = 1LL * (mod - mod / i) * inv[mod % i] % mod; //加mod不改变结果
} void solve2()
{
if(n == )
{
printf("2 1\n");
return;
}
if(n == )
{
printf("2 1 3 2 4\n");
return;
}
sieve(n);
if(!is_prime[n])
{
printf("0\n");
return;
}
init_inv(n, n);
printf("2 1 ");
for(int i = ;i <= n-;i++) printf("%d ", 1LL * i * inv[i-] % n);
printf("%d\n", n);
} int main()
{
scanf("%d%d", &task, &T);
while(T--)
{
scanf("%d", &n);
if(task == ) solve1();
else solve2();
}
return ;
}
参考链接:
1. https://oi-wiki.org/basic/construction/
2. https://www.luogu.org/problemnew/solution/P3599
P3599 Koishi Loves Construction——构造题的更多相关文章
- C 洛谷 P3599 Koishi Loves Construction [构造 打表观察]
题目描述 Koishi决定走出幻想乡成为数学大师! Flandre听说她数学学的很好,就给Koishi出了这样一道构造题: Task1:试判断能否构造并构造一个长度为的的排列,满足其个前缀和在模的意义 ...
- 洛谷P3599 Koishi Loves Construction 构造
正解:构造 解题报告: 传送门! 这题俩问嘛,就分成两个问题港QwQ 就按顺序趴,先港第一问QwQ 首先要发现,n在膜n意义下就是0嘛 那作为前缀和的话显然它就只能放在第一个 然后再想下,发现,如果n ...
- 【题解】P3599 Koishi Loves Construction
[题解]P3599 Koishi Loves Construction \(\mod n\) 考虑如何构造,发现\(n\)一定在第一位,不然不行.\(n\)一定是偶数或者是\(1\),不然 \(n|\ ...
- 题解-Koishi Loves Construction
题解-Koishi Loves Construction 前缀知识 质数 逆元 暴搜 Koishi Loves Construction 给定 \(X\),\(T\) 组测试数据,每次给一个 \(n\ ...
- 【Luogu3602】Koishi Loves Segments(贪心)
[Luogu3602]Koishi Loves Segments(贪心) 题面 洛谷 题解 离散区间之后把所有的线段挂在左端点上,从左往右扫一遍. 对于当前点的限制如果不满足显然会删掉右端点最靠右的那 ...
- cf251.2.C (构造题的技巧)
C. Devu and Partitioning of the Array time limit per test 1 second memory limit per test 256 megabyt ...
- hdu4671 Backup Plan ——构造题
link:http://acm.hdu.edu.cn/showproblem.php?pid=4671 其实是不难的那种构造题,先排第一列,第二列从后往前选. #include <iostrea ...
- Educational Codeforces Round 7 D. Optimal Number Permutation 构造题
D. Optimal Number Permutation 题目连接: http://www.codeforces.com/contest/622/problem/D Description You ...
- Codeforces 482 - Diverse Permutation 构造题
这是一道蛮基础的构造题. - k +(k - 1) -(k - 2) 1 + k , 1 , k , 2, ....... ...
随机推荐
- English Learning -- 0611--When Burnout Is a Sign You Should Leave Your Job
I like the following article from Harvard Business Review, as I ever experienced burnout at work. Ve ...
- 使用speedtest-cli测量服务器带宽
使用speedtest-cli测量服务器带宽,这个是python写的工具,很方便,只需要在服务器端安装即可. 1.安装python-pip # yum install python-pip –y 2. ...
- 请求部署在 IIS7.5 上的 REST 服务的 Put/Post/Delete 操作发生 HTTP Error 405.0 - Method Not Allowed 错误之解决
背景 请求部署在 IIS7.5 上的 REST 服务的 Put/POST/DELETE 操作发生 HTTP Error 405.0 - Method Not Allowed 错误. Issue 解决 ...
- Web基础和servlet基础
TomCat的目录结构 Bin:脚本目录(存放启动.关闭这些命令) Conf:存放配置文件的目录 Lib:存放jar包 Logs: 存放日志文件 Temp: 临时文件 Webapps: 项目发布目录 ...
- shell从简单到脱坑
1.计算1-100的和(seq 1 100 使用反引号括起来的比较坑) #!/bin/bash ` do sum=$[$i+$sum] done echo $sum 2.编写shell脚本,要求输入一 ...
- go语言实现单链表
线性表包含两种存储方法:顺序存储结构和链式存储结构,其中顺序表的缺点是不便插入与删除数据. 单链表:每个结点包含两部分:数据域+指针域,上一个结点的指针指向下一结点,依次相连,形成链表.特别注意的是每 ...
- Python内存加载shellcode
生成 首先生成一个测试的msf shellcode msfvenom -p windows/x64/exec CMD=calc.exe -f python 把其中的shellcode复制出来留待待会使 ...
- Qt更新组件出现(“要继续此操作,至少需要一个有效且已启用的储存库”)
Qt更新组件出现(“要继续此操作,至少需要一个有效且已启用的储存库”) 目的: 当时在安装Qt时,有些组件暂时没用着,然后过一段时间后,需要用到某些该组件时,不用删掉重新再安装. 操作: Wind ...
- oracle-3-Linux-11g安装-图形安装
在安装系统时就安装了图形桌面 参考博客地址:https://www.cnblogs.com/tibit/p/6134150.html 未参考,只是感觉不错:https://blog.csdn.net/ ...
- VS.NET(C#)--2.9_HTML服务器控件案例
HTML服务区控件案例 UI设计视图 UI源码视图 <>