题目描述

Koishi决定走出幻想乡成为数学大师!

Flandre听说她数学学的很好,就给Koishi出了这样一道构造题:

Task1:试判断能否构造并构造一个长度为的排列,满足其个前缀和在模的意义下互不相同

Taks2:试判断能否构造并构造一个长度为的排列,满足其个前缀积在模的意义下互不相同

按照套路,Koishi假装自己根本不会捉,就来找你帮忙辣。

输入输出格式

输入格式:

第一行两个整数,分别表示Task类型和测试点内的数据组数。

接下来行,每行一个整数表示每组数据中的

输出格式:

为了方便SPJ的编写,您需要遵从以下格式输出。

对于每组数据仅包含一行输出:

  1. 如果您认为当前数据不存在符合题意的构造,只需输出一个整数

  2. 如果您认为当前数据存在符合题意的构造却不会构造,只需输出一个整数

  3. 如果您认为当前数据存在符合题意的构造并成功构造,则需要先输出一个整数,再输出个整数表示构造的方案。

每两个整数之间需要有空格作为分隔符

输入输出样例

输入样例#1:

1 1
8
输出样例#1:

2 8 7 6 5 4 3 2 1
输入样例#2:

2 1
11
输出样例#2:

2 1 2 3 5 10 6 7 4 9 8 11

说明

对于每组数据

  1. 如果您对于构造的存在性判断正确,您将会得到的分数,若您的构造符合题意或者确实不存在符合题意的构造,您将会得到剩余的的分数。

  2. 如果您对于构造的存在性判断不正确,您将不会得到任何分数。

对于每组测试点,您的得分将是本组数据点中得分的最小值。

测试点类型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 [构造 打表观察]的更多相关文章

  1. 洛谷P3599 Koishi Loves Construction 构造

    正解:构造 解题报告: 传送门! 这题俩问嘛,就分成两个问题港QwQ 就按顺序趴,先港第一问QwQ 首先要发现,n在膜n意义下就是0嘛 那作为前缀和的话显然它就只能放在第一个 然后再想下,发现,如果n ...

  2. P3599 Koishi Loves Construction——构造题

    题目 Task1:试判断能否构造并构造一个长度 $n$ 的 $1...n$ 的排列,满足其 $n$ 个前缀和在模 $n$ 的意义下互不相同 Task2:试判断能否构造并构造一个长度 $n$ 的 $1. ...

  3. 【题解】P3599 Koishi Loves Construction

    [题解]P3599 Koishi Loves Construction \(\mod n\) 考虑如何构造,发现\(n\)一定在第一位,不然不行.\(n\)一定是偶数或者是\(1\),不然 \(n|\ ...

  4. 洛谷P3602 Koishi Loves Segments(贪心,multiset)

    洛谷题目传送门 贪心小水题. 把线段按左端点从小到大排序,限制点也是从小到大排序,然后一起扫一遍. 对于每一个限制点实时维护覆盖它的所有线段,如果超过限制,则贪心地把右端点最大的线段永远删去,不计入答 ...

  5. E 洛谷 P3598 Koishi Loves Number Theory[数论]

    题目描述 Koishi十分喜欢数论. 她的朋友Flandre为了检测她和数论是不是真爱,给了她一个问题. 已知 给定和个数,求对取模. 按照套路,呆萌的Koishi当然假装不会做了,于是她来向你请教这 ...

  6. D 洛谷 P3602 Koishi Loves Segments [贪心 树状数组+堆]

    题目描述 Koishi喜欢线段. 她的条线段都能表示成数轴上的某个闭区间.Koishi喜欢在把所有线段都放在数轴上,然后数出某些点被多少线段覆盖了. Flandre看她和线段玩得很起开心,就抛给她一个 ...

  7. 洛谷P3602 Koishi Loves Segments 贪心

    正解:贪心 解题报告: 传送门! 首先在学习贪心的入门题的时候我们就知道,当x=1的时候,也就是每条线段不能相交的时候的做法——就按右端点排序然后能选就选,也就是会议安排问题,原因显然?就你选右端点更 ...

  8. 题解-Koishi Loves Construction

    题解-Koishi Loves Construction 前缀知识 质数 逆元 暴搜 Koishi Loves Construction 给定 \(X\),\(T\) 组测试数据,每次给一个 \(n\ ...

  9. 洛谷 P1580 yyy loves Easter_Egg I

    洛谷 P1580 yyy loves Easter_Egg I 题解: 队列+字符串 #include <cstdio> #include <string> #include ...

随机推荐

  1. c++(数据选择)

    在数学中,有一些数据选择的内容.举个例子来说,有这样一组数据:1.2.3.4.现在我们打算从中挑选出1个数据,那么有几种选择呢?结果应该是1.2.3.4:那么如果挑选2个数据呢,怎么选呢?那么结果应该 ...

  2. Java入门篇(四)——数组

    上篇在foreach中有引入一个数组的概念,数组是最为常见的一种数据结构,是相同类型的.用一个标识符封装到一起的基本类型数据序列或对象序列. 数组是具有相同数据类型的一组数据的集合,根据维数不同可以分 ...

  3. for语句,你真正搞懂了吗?

    今天看书时,无意间看到了这个知识点,啥知识点?也许在各位大神看来,那是再简单不过的东西了. 说来惭愧.原来直到今天我才真正搞懂for语句. for语句的结构如下所示: for(语句A;语句B;语句C) ...

  4. Linux 将本地文件上传Linux服务器, 即ssh 命令上传本地文件

    利用ssh传输文件   在linux下一般用scp这个命令来通过ssh传输文件. 1.从服务器上下载文件 scp username@servername:/path/filename /var/www ...

  5. Mysql开启远程连接方法

    分类: 数据库开发技术 解决MySQL不允许从远程访问的方法 开启 MySQL 的远程登陆帐号有两大步: 1.确定服务器上的防火墙没有阻止 3306 端口. MySQL 默认的端口是 3306 ,需要 ...

  6. ThinkPhp 添加模型类

    ----------------------------------------------- <?phpnamespace app\common\model;use traits\model\ ...

  7. Google免费GPU使用教程

    今天突然看到一篇推文,里面讲解了如何薅资本主义羊毛,即如何免费使用Google免费提供的GPU使用权. 可以免费使用的方式就是通过Google Colab,全名Colaboratory.我们可以用它来 ...

  8. Ajax常用实例

    摘录自:http://www.cnblogs.com/gaopeng527/p/4459622.html 1. 级联下拉列表 例1.1 级联下拉列表. (1)编写AjaxRequest.js文件,并将 ...

  9. Excel的列编号 例如:A对应1,Z对应26,AA对应27,AZ对应52的JavaScript怎么写?

    今天碰到的题目,当时不会.回来想了一会,调试了一下,然后想上网对答案,发现竟然没有!!! function str(num){ if(num<=0){ alert("excel表格貌似 ...

  10. jQuery hover() 方法

    $("p").hover(function(){ $("p").css("background-color","yellow&qu ...