C 洛谷 P3599 Koishi Loves Construction [构造 打表观察]
题目描述
Koishi决定走出幻想乡成为数学大师!
Flandre听说她数学学的很好,就给Koishi出了这样一道构造题:
Task1:试判断能否构造并构造一个长度为的
的排列,满足其
个前缀和在模
的意义下互不相同
Taks2:试判断能否构造并构造一个长度为的
的排列,满足其
个前缀积在模
的意义下互不相同
按照套路,Koishi假装自己根本不会捉,就来找你帮忙辣。
输入输出格式
输入格式:
第一行两个整数和
,分别表示Task类型和测试点内的数据组数。
接下来行,每行一个整数表示每组数据中的
输出格式:
为了方便SPJ的编写,您需要遵从以下格式输出。
对于每组数据仅包含一行输出:
如果您认为当前数据不存在符合题意的构造,只需输出一个整数
如果您认为当前数据存在符合题意的构造却不会构造,只需输出一个整数
- 如果您认为当前数据存在符合题意的构造并成功构造,则需要先输出一个整数
,再输出
个整数表示构造的方案。
每两个整数之间需要有空格作为分隔符
输入输出样例
1 1
8
2 8 7 6 5 4 3 2 1
2 1
11
2 1 2 3 5 10 6 7 4 9 8 11
说明
对于每组数据
如果您对于构造的存在性判断正确,您将会得到
的分数,若您的构造符合题意或者确实不存在符合题意的构造,您将会得到剩余的
的分数。
- 如果您对于构造的存在性判断不正确,您将不会得到任何分数。
对于每组测试点,您的得分将是本组数据点中得分的最小值。
测试点类型1:10分,满足
测试点类型2:40分,满足
测试点类型3:10分,满足
测试点类型4:40分,满足
对于所有测试点,满足
当时想出如何判断了但是不会构造
前缀和不存在就是n|(1+2+...+n)
前缀积不存在就是n|(n-1)!
直接上标解了:
Task1:
通过爆搜观察发现,除了
以外的奇数都无解,偶数都有解。
证明:由于
,也就是说
必须放于第一位,前缀和第一位一定是
,奇数情况下又由于
,也就是说前缀和最后一位一定是
,导致矛盾。
打表观察,每个偶数搜出来的方案都有
,不难证明其正确性。
Task2:
通过爆搜观察发现,除了
以外的合数都无解,质数都有解。
证明:考虑到
,那么前缀积的最后一项一定是
,也就是说最后一项尽量放
,那么这要求
,发现只有
和质数胜任这个要求。
打表观察,每个质数搜出来的前缀积方案都有
,也就是说第
位就是
,通过逆元算出来就可以了。1和4的情况特判即可。
醉了快速幂又写成if(b)......
//
// main.cpp
// CC
//
// Created by Candy on 2017/2/2.
// Copyright © 2017年 Candy. All rights reserved.
// #include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
using namespace std;
typedef long long ll;
inline int read(){
char c=getchar();int x=,f=;
while(c<''||c>''){if(c=='-')f=-; c=getchar();}
while(c>=''&&c<=''){x=x*+c-''; c=getchar();}
return x*f;
}
int task,T,n;
void solve1(int n){
if(n==) puts("2 1");
else if(n&) puts("");
else{
printf("2 ");
printf("%d ",n);
for(int i=;i<n;i++){
if(i&) printf("%d ",i);
else printf("%d ",n-i);
}
puts("");
}
}
inline bool isP(int n){
if(n==) return true;
int m=sqrt(n)+;
for(int i=;i<=m;i++) if(n%i==) return false;
return true;
}
ll powMod(ll a,ll b,ll MOD){
ll ans=;
for(;b;b>>=,a=(a*a)%MOD)
if(b&) ans=(ans*a)%MOD;
return ans;
}
void solve2(int n){
if(n==) puts("2 1");
else if(n==) puts("2 1 2");
else if(n==) puts("2 1 3 2 4");
else if(!isP(n)) puts("");
else{
printf("2 1 ");
for(int i=;i<=n;i++){
printf("%lld ",(i*powMod(i-,n-,n)-)%n+);
}
puts("");
}
}
int main(int argc, const char * argv[]) {
task=read();T=read();
while(T--){
n=read();
if(task==) solve1(n);
else solve2(n);
}
return ;
}
C 洛谷 P3599 Koishi Loves Construction [构造 打表观察]的更多相关文章
- 洛谷P3599 Koishi Loves Construction 构造
正解:构造 解题报告: 传送门! 这题俩问嘛,就分成两个问题港QwQ 就按顺序趴,先港第一问QwQ 首先要发现,n在膜n意义下就是0嘛 那作为前缀和的话显然它就只能放在第一个 然后再想下,发现,如果n ...
- P3599 Koishi Loves Construction——构造题
题目 Task1:试判断能否构造并构造一个长度 $n$ 的 $1...n$ 的排列,满足其 $n$ 个前缀和在模 $n$ 的意义下互不相同 Task2:试判断能否构造并构造一个长度 $n$ 的 $1. ...
- 【题解】P3599 Koishi Loves Construction
[题解]P3599 Koishi Loves Construction \(\mod n\) 考虑如何构造,发现\(n\)一定在第一位,不然不行.\(n\)一定是偶数或者是\(1\),不然 \(n|\ ...
- 洛谷P3602 Koishi Loves Segments(贪心,multiset)
洛谷题目传送门 贪心小水题. 把线段按左端点从小到大排序,限制点也是从小到大排序,然后一起扫一遍. 对于每一个限制点实时维护覆盖它的所有线段,如果超过限制,则贪心地把右端点最大的线段永远删去,不计入答 ...
- E 洛谷 P3598 Koishi Loves Number Theory[数论]
题目描述 Koishi十分喜欢数论. 她的朋友Flandre为了检测她和数论是不是真爱,给了她一个问题. 已知 给定和个数,求对取模. 按照套路,呆萌的Koishi当然假装不会做了,于是她来向你请教这 ...
- D 洛谷 P3602 Koishi Loves Segments [贪心 树状数组+堆]
题目描述 Koishi喜欢线段. 她的条线段都能表示成数轴上的某个闭区间.Koishi喜欢在把所有线段都放在数轴上,然后数出某些点被多少线段覆盖了. Flandre看她和线段玩得很起开心,就抛给她一个 ...
- 洛谷P3602 Koishi Loves Segments 贪心
正解:贪心 解题报告: 传送门! 首先在学习贪心的入门题的时候我们就知道,当x=1的时候,也就是每条线段不能相交的时候的做法——就按右端点排序然后能选就选,也就是会议安排问题,原因显然?就你选右端点更 ...
- 题解-Koishi Loves Construction
题解-Koishi Loves Construction 前缀知识 质数 逆元 暴搜 Koishi Loves Construction 给定 \(X\),\(T\) 组测试数据,每次给一个 \(n\ ...
- 洛谷 P1580 yyy loves Easter_Egg I
洛谷 P1580 yyy loves Easter_Egg I 题解: 队列+字符串 #include <cstdio> #include <string> #include ...
随机推荐
- Windows7下设置定时启动(关闭)虚拟机
曾记否,忆当年,开启或者关闭虚拟机,度秒如年~ ⒈石头,剪刀,布,C.D.E盘随便找一个,然后在里面找个静谧的墙角, 新建一个文件:vmstart.bat 添加:"C:\Program Fi ...
- 客户端怎么查看SVN的代码库
安装SVN客户端,比如TortoiseSVN,然后将代码库checkout到本地,或者通过客户端的版本库浏览器直接连接SVN服务器查看代码库的目录结构. 如果SVN服务器端安装的时候是和Apache集 ...
- dubbo源码—Service Reply
dubbo通过netty将请求发送到provider的时候,provider之前已经启动好的NettyServer监听指定端口的时候会收到来自consumer的请求,将通过网络发送来的二进制编码成Re ...
- JavaScript对象的valueOf()方法
js对象中的valueOf()方法和toString()方法非常类似,但是,当需要返回对象的原始值而非字符串的时候才调用它,尤其是转换为数字的时候.如果在需要使用原始值的上下文中使用了对象,JavaS ...
- canvas实现倒计时效果示例(vue组件内编写)
前言: 此事例是在vue组件中,使用canvas实现倒计时动画的效果.其实,实现效果的逻辑跟vue没有关系,只要读懂canvas如何实现效果的这部分逻辑就可以了 canvas动画的原理:利用定时器,给 ...
- c# gdi设置画刷透明
使用solidBrush新建画刷,定义画刷的颜色为透明色 Brush b = new SolidBrush(Color.FromArgb(50, Color.Green)); 这里的50是透明度的设置 ...
- Django_form验证
需求: 当用户向Django后端以post提交数据的时候,无论前端是否进行数据合法验证,后端都需要对客户端提交过来的数据进行数据合法性验证,是否可以利用models中表类字段的约束来实现验证,并且可以 ...
- windows的三种内存管理方法
Windows的内存管理方法 windows提供了3种方法来进行内存管理: l 虚拟内存,最适合用来管理大型对象或者结构数组 l 内存映射文件,最适合用来管理大型数据流 ...
- Windows核心编程&错误处理
知识概要 (1) MAKELANGID Windows宏,用一个来主语言标识和从语言标识创建一个语言标识符 MAKELANGID(ushort usPrimaryLanguage, ushort us ...
- Linux用户登录记录日志和相关查看命令汇总
# 1 utmp.wtmp.btmp文件 Linux用户登录信息放在三个文件中: 1 /var/run/utmp:记录当前正在登录系统的用户信息,默认由who和w记录当前登录用户的信息,uptime记 ...