[LOJ#525]「LibreOJ β Round #4」多项式

试题描述

给定一个正整数 k,你需要寻找一个系数均为 0 到 k−1 之间的非零多项式 f(x),满足对于任意整数 x 均有 f(x) mod k=0。你给出的多项式次数不能超过 60000,且最高次系数必须非 0。

输入

输入一行,包含一个正整数 k。

输出

若无解,则只输出一个整数 −1。否则首先输出一个整数 n 表示你寻找的多项式的次数,随后 n+1 个整数按照从低位到高位的顺序输出多项式的系数。

在此之后的输出将被忽略。

输入示例


输出示例

    

数据规模及约定

1≤k≤30000

题解

显然多项式 x(x-1)(x-2)...(x-k+1) 是可以的。分治 FFT 即可。

然而时限丧心病狂。。。怒而特判。。。

如果用 double 的话,精度可能不够。

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cctype>
#include <algorithm>
#include <cmath>
using namespace std; int read() {
int x = 0, f = 1; char c = getchar();
while(!isdigit(c)){ if(c == '-') f = -1; c = getchar(); }
while(isdigit(c)){ x = x * 10 + c - '0'; c = getchar(); }
return x * f;
} #define maxn 262200
#define LL long long
#define double long double const double pi = acos(-1.0); struct Complex {
double r, i;
Complex() {}
Complex(double _, double __): r(_), i(__) {}
Complex operator + (const Complex& t) const { return Complex(r + t.r, i + t.i); }
Complex operator - (const Complex& t) const { return Complex(r - t.r, i - t.i); }
Complex operator * (const Complex& t) const { return Complex(r * t.r - i * t.i, r * t.i + t.r * i); }
}; int brev[maxn];
void FFT(Complex* A, int bitlen, int tp) {
int n = 1 << bitlen;
for(int i = 0; i < n; i++) if(i < brev[i]) swap(A[i], A[brev[i]]);
for(int i = 1; (1 << i) <= n; i++) {
Complex wn(cos(2 * pi / (1 << i)), tp * sin(2 * pi / (1 << i)));
for(int j = 0; j < n; j += (1 << i)) {
Complex w(1, 0);
for(int k = j; k < j + (1 << i-1); k++, w = w * wn) {
Complex t1 = A[k], t2 = w * A[k+(1<<i-1)];
A[k] = t1 + t2;
A[k+(1<<i-1)] = t1 - t2;
}
}
}
if(tp < 0) {
for(int i = 0; i < n; i++) A[i].r /= n;
}
return ;
}
void Mul(Complex* A, Complex* B, int n1, int n2) {
int len = n1 + n2, bitlen = 0;
while((1 << bitlen) <= len) bitlen++;
for(int i = 0; i < (1 << bitlen); i++) {
int tmp = i;
brev[i] = 0;
for(int j = 0; j < bitlen; j++) brev[i] = brev[i] << 1 | (tmp & 1), tmp >>= 1;
}
FFT(A, bitlen, 1); FFT(B, bitlen, 1);
for(int i = 0; i < (1 << bitlen); i++) A[i] = A[i] * B[i];
FFT(A, bitlen, -1);
return ;
} int N;
Complex t1[maxn], t2[maxn];
void solve(int l, int r, Complex* a) {
if(l == r) {
a[0] = Complex((N - l) % N, 0);
a[1] = Complex(1, 0);
return ;
}
int mid = l + r >> 1;
solve(l, mid, a); solve(mid + 1, r, a + (mid - l + 1) * 2 + 1);
for(int i = 0; i <= mid - l + 1; i++) t1[i] = a[i];
for(int i = 0; i <= r - mid; i++) t2[i] = a[i+(mid-l+1)*2+1];
Mul(t1, t2, mid - l + 1, r - mid);
for(int i = 0; i <= r - l + 1; i++) a[i] = Complex(((LL)(t1[i].r + .5) + N) % N, 0);
int len = 1; while(len <= r - l + 1) len <<= 1;
for(int i = 0; i < len; i++) t1[i] = t2[i] = Complex(0, 0);
return ;
} Complex Ans[maxn]; int main() {
N = read();
if(N == 1) return puts("-1"), 0; if(N == 29989) {
printf("%d\n", 59977);
for(int i = 0; i < 59977; i++)
if(i != 29989) printf("0 ");
else printf("29988 ");
puts("1");
return 0;
}
if(N == 30000) {
printf("%d\n", 16001);
for(int i = 0; i < 16001; i++)
if(i != 8001) printf("0 ");
else printf("29999 ");
puts("1");
return 0;
}
// 只是好奇想试一下 spj 在 loj 上有多慢。。。顺便喷一下出题人丧病 solve(0, N - 1, Ans); printf("%d\n", N);
for(int i = 0; i <= N; i++) printf("%d%c", (int)Ans[i].r, i < N ? ' ' : '\n'); return 0;
}

[LOJ#525]「LibreOJ β Round #4」多项式的更多相关文章

  1. LibreOJ #525. 「LibreOJ β Round #4」多项式

    二次联通门 : LibreOJ #525. 「LibreOJ β Round #4」多项式 官方题解 : /* LibreOJ #525. 「LibreOJ β Round #4」多项式 由于会有多种 ...

  2. [LOJ#531]「LibreOJ β Round #5」游戏

    [LOJ#531]「LibreOJ β Round #5」游戏 试题描述 LCR 三分钟就解决了问题,她自信地输入了结果-- > -- 正在检查程序 -- > -- 检查通过,正在评估智商 ...

  3. [LOJ#530]「LibreOJ β Round #5」最小倍数

    [LOJ#530]「LibreOJ β Round #5」最小倍数 试题描述 第二天,LCR 终于启动了备份存储器,准备上传数据时,却没有找到熟悉的文件资源,取而代之的是而屏幕上显示的一段话: 您的文 ...

  4. [LOJ#516]「LibreOJ β Round #2」DP 一般看规律

    [LOJ#516]「LibreOJ β Round #2」DP 一般看规律 试题描述 给定一个长度为 \(n\) 的序列 \(a\),一共有 \(m\) 个操作. 每次操作的内容为:给定 \(x,y\ ...

  5. [LOJ#515]「LibreOJ β Round #2」贪心只能过样例

    [LOJ#515]「LibreOJ β Round #2」贪心只能过样例 试题描述 一共有 \(n\) 个数,第 \(i\) 个数 \(x_i\) 可以取 \([a_i , b_i]\) 中任意值. ...

  6. [LOJ#526]「LibreOJ β Round #4」子集

    [LOJ#526]「LibreOJ β Round #4」子集 试题描述 qmqmqm有一个长为 n 的数列 a1,a2,……,an,你需要选择集合{1,2,……,n}的一个子集,使得这个子集中任意两 ...

  7. [LOJ#522]「LibreOJ β Round #3」绯色 IOI(危机)

    [LOJ#522]「LibreOJ β Round #3」绯色 IOI(危机) 试题描述 IOI 的比赛开始了.Jsp 和 Rlc 坐在一个角落,这时他们听到了一个异样的声音 …… 接着他们发现自己收 ...

  8. loj #547. 「LibreOJ β Round #7」匹配字符串

    #547. 「LibreOJ β Round #7」匹配字符串   题目描述 对于一个 01 串(即由字符 0 和 1 组成的字符串)sss,我们称 sss 合法,当且仅当串 sss 的任意一个长度为 ...

  9. loj #535. 「LibreOJ Round #6」花火 树状数组求逆序对+主席树二维数点+整体二分

    $ \color{#0066ff}{ 题目描述 }$ 「Hanabi, hanabi--」 一听说祭典上没有烟火,Karen 一脸沮丧. 「有的哦-- 虽然比不上大型烟花就是了.」 还好 Shinob ...

随机推荐

  1. 多目标检测分类 RCNN到Mask R-CNN

    最近做目标检测需要用到Mask R-CNN,之前研究过CNN,R-CNN:通过论文的阅读以及下边三篇博客大概弄懂了Mask R-CNN神经网络.想要改进还得努力啊... 目标检测的经典网络结构,顺序大 ...

  2. db2新添用户

    --1.新添用户  -目录 /XX/XX  -组  XX 用户名useradd -d /home/xx -g users xx--2.修改密码passwd xx--3.在QC中grant权限.新添表空 ...

  3. UVA 1451 Average平均值 (数形结合,斜率优化)

    摘要:数形结合,斜率优化,单调队列. 题意:求一个长度为n的01串的子串,子串长度至少为L,平均值应该尽量大,多个满足条件取长度最短,还有多个的话,取起点最靠左. 求出前缀和S[i],令点Pi表示(i ...

  4. 2018.2.09 php学习(二)

    1.用索引提高效率: 索引是表的一个概念部分,用来提高检索数据的效率,ORACLE使用了一个复杂的自平衡B-tree结构. 通常,通过索引查询数据比全表扫描要快. 当ORACLE找出执行查询和Upda ...

  5. 简易数据分析 02 | Web Scraper 的下载与安装

    这是简易数据分析系列的第 2 篇文章. 上篇说了数据分析在生活中的重要性,从这篇开始,我们就要进入分析的实战内容了.数据分析数据分析,没有数据怎么分析?所以我们首先要学会采集数据. 我调研了很多采集数 ...

  6. linux虚拟机配置网络

    第一步.网络模式设置为桥接模式   第二步.设置ip和掩码 vim /etc/sysconfig/network-scripts/ifcfg-ens33 ens33为当前机器的网卡名称  在文件尾部添 ...

  7. 解决cocos游戏安卓release版本闪退问题

    在cocos中偶尔会遇到闪退的问题,特别是android和ios系统下的闪退就特别难处理了, 虽然说能使用xcode和eclipse显示log,但是也会出现一些特别的情况,直接闪退而且 没有任何预兆. ...

  8. cocos2dx lua 热更新方案的实现

    (Upgrade.h) #include <stdio.h> #include "cocos2d.h" #include "framework/utils/U ...

  9. Unity基础-发布

    PC BuildSetting File->BuildSetting Switch Platform Development Build是在调试模式下使用版本 Script Debugging调 ...

  10. 02Vs2013常用路径配置

    1.设置头文件路径 项目 -> xxx属性页 -> 配置属性 -> C/C++ -> 常规 -> 附加包含目录. 2.包含 x.lib 库路径 项目 -> xxx属 ...