「CodeChef Dec13 REALSET」 Petya and Sequence 循环卷积
题目大意:
T组询问。
每组给一个数组,询问该数组是否循环移位线性无关,输出YES或NO。
题解:
LCA冬令营有讲……然而当时……
并不知道如何计算一个数组是否循环移位线性无关……网上也没有……学校还加了白名单,翻不了墙,看不了wiki(英文看不懂……)。所以这就是我怂题解的理由23333。
题解上说wiki上循环矩阵的行列式等于其DFT后点值乘积。即对于矩阵:

有:

显然如果循环数组的矩阵的轶不为n的话其行列式必然为0。
所以把数组DFT以后看一下其乘积是否为0即可。
证明什么的……留个坑吧。
看到了一个大神打了几十行……没看懂在干什么……
LCA说还可以用分圆多项式,然而并没有找到资料。再留个坑吧……
代码:
#include "bits/stdc++.h"
using std::swap;
inline int read () {
int s=,k=;char ch=getchar();
while (ch<''|ch>'') ch=='-'?k=-:,ch=getchar();
while (ch>&ch<='') s=s*+(ch^),ch=getchar();
return s*k;
}
typedef long long ll;
const int N=1e5+;
ll mod,g,w[][N],W[][N],n,m;
inline ll gcd (ll a,ll b) {
return b?gcd(b,a%b):a;
}
inline ll Mult ( ll a,ll b ) {
return ( a*b - (ll)( (long double) a*b/mod )*mod + mod )% mod;
}
inline ll powmod ( ll a, ll b ) {
ll ret=;
while (b) {
if (b&) ret=Mult ( ret, a );
b>>=,a=Mult ( a, a);
}return ret;
}
inline int is_prim(ll x) {
for (int i=;1ll*i*i<=x;++i)
if (x%i==) return false;
return true;
}
inline int is_prim_root(ll x,ll y){
for (int i=;1ll*i*i<y;++i)
if ((y-)%i==) {
if (powmod(x,i)==) return false;
if (powmod(x,(y-)/i)==)return false;
}
return true;
}
inline void init () {
for (m=;m<=*n;m<<=);
ll lcm = n*m/gcd(n,m);
mod = lcm + ;
for (int i=;~i;--i)
if (mod + (lcm<<i)<1e3*n) mod+=lcm<<i;
while (mod<1e3*n) mod+=lcm;
while (!is_prim(mod)) mod+=lcm;
for (g=;;++g) {
int flag=true;
for (int i=;1ll*i*i<=mod;++i) if ((mod-)%i==){
if (powmod(g,i)==) {flag=false;break;}
if (powmod(g,(mod-)/i)==) {flag=false;break;}
}
if (flag) break;
}
ll w0=powmod(g,(mod-)/m);
w[][]=w[][]=;
int i;
for (i=;i<m;++i) w[][i]=Mult(w[][i-],w0);
for (i=;i<m;++i) w[][i]=w[][m-i];
w0=powmod(g,(mod-)/n);
W[][]=W[][]=;
for (i=;i<n;++i) W[][i]=Mult(W[][i-],w0);
for (i=;i<n;++i) W[][i]=W[][n-i];
}
inline void NTT(ll *a,int n,int f) {
register int i,j,k,l,t;
for (i=j=;i^n;++i) {
if (i>j) std::swap(a[i],a[j]);
for (k=n>>;(j^=k)<k;k>>=);
}
for (i=;i<n;i<<=)
for (j=,t=n/(i<<);j<n;j+=i<<)
for (k=l=;k<i;++k , l+=t ) {
ll x=a[j+k],y=Mult(a[i+j+k],w[f][l]);
a[j+k]=x+y;
a[i+j+k]=x-y;
if (a[j+k]>=mod) a[j+k]-=mod;
if (a[i+j+k]<) a[i+j+k]+=mod;
}
if (f ) {
ll rev=powmod ( n,mod- );
for (i=;i<n;++i) a[i]=Mult(a[i],rev);
}
}
inline void Bluesteins(ll *a,int f){
static ll X[N],Y[N];
register int i;
for (i=;i<*n;++i) Y[*n--i]=W[f][1ll*i*(i-)/%n];
for (i=*n;i<m;++i) Y[i]=;
NTT(Y,m,);
for (i=;i<n;++i) X[i]=Mult(a[i],W[f][ (n-1ll*i*(i-)/%n)%n ]);
for (i=n;i<m;++i) X[i]=;
NTT(X,m,);
for (i=;i<m;++i) X[i]=Mult(X[i],Y[i]);
NTT(X,m,);
for (i=;i<n;++i)
a[i]=Mult (X[*n--i],W[f][(n-1ll*i*(i-)/%n)%n ]);
if (f) {
ll rev=powmod(n,mod-);
for (i=;i<n;++i) a[i]=Mult(a[i],rev);
}
}
ll a[N];
int main (int argc, char const* argv[]){
//freopen("Dec13Realset.in","r",stdin);
int T=read(),i;
while (T-- ){
n=read();
for (i=;i<n;++i) a[i]=read();
init();
Bluesteins(a,);
ll flag=;
for (i=;i<n;++i) flag=Mult(flag,a[i]);
puts(flag?"NO":"YES");
}
return ;
}
「CodeChef Dec13 REALSET」 Petya and Sequence 循环卷积的更多相关文章
- 「Codechef April Lunchtime 2015」Palindromeness
「Codechef April Lunchtime 2015」Palindromeness 解题思路 : 考虑对于回文子串 \(s\) 贡献的定义: \[ value_s = [\ s[1,\lflo ...
- 对于前端,「微信小程序」其实不美好
微信小程序开放公测了,9月底我曾经写过一篇 「微信小程序」来了,其中最后一句:"谢天谢地,我居然还是个前端". 这种火爆的新事物总是令人激动,感谢这个时代. 但是,当我真作为开发者 ...
- macOS安装「oh my zsh」
目前常用的 Linux 系统和 OS X 系统的默认 Shell 都是 bash,但是真正强大的 Shell 是深藏不露的 zsh, 这货绝对是马车中的跑车,跑车中的飞行车,史称『终极 Shell』, ...
- 报名|「OneAPM x DaoCloud」技术公开课:Docker性能监控!
如今,越来越多的公司开始 Docker 了,「三分之二的公司在尝试了 Docker 后最终使用了它」,也就是说 Docker 的转化率达到了 67%,同时转化时长也控制在 60 天内. 既然 Dock ...
- 企业运营对 DevOps 的「傲慢与偏见」
摘要:出于各种原因,并非所有人都信任 DevOps .有些人觉得 DevOps 只不过给开发者改善产品提供了一个途径而已,还有的人觉得 DevOps 是一堆悦耳的空头支票,甚至有人认为 DevOps ...
- 「前端开发者」如何把握住「微信小程序」这波红利?
由于前两周一直在老家处理重要事情,虽然朋友圈被「微信小程序」刷爆了,但并没有时间深入了解. 昨天回广州之后,第一件事情就是把「微信小程序」相关的文章.开发文档.设计规范全部看了一遍,基本上明白了「微信 ...
- 「花田对」CSDN程序员专场——谁来拯救技术宅!_豆瓣
「花田对」CSDN程序员专场--谁来拯救技术宅!_豆瓣 「花田对」CSDN程序员专场--谁来拯救技术宅!
- Objective-C 实用关键字详解1「面试、工作」看我就 🐒 了 ^_^.
在写项目 或 阅读别人的代码(一些优秀的源码)中,总能发现一些常见的关键字,随着编程经验的积累大部分还是知道是什么意思 的. 相信很多开发者跟我当初一样,只是基本的常用关键字定义属性会使用,但在关键字 ...
- LOJ6003 - 「网络流 24 题」魔术球
原题链接 Description 假设有根柱子,现要按下述规则在这根柱子中依次放入编号为的球. 每次只能在某根柱子的最上面放球. 在同一根柱子中,任何2个相邻球的编号之和为完全平方数. 试设计一个算法 ...
随机推荐
- div学习之div中dl-dt-dd的详解
dl dt dd认识及dl dt dd使用方法 <dl> 标签用于定义列表类型标签. dl dt dd目录 dl dt dd介绍 结构语法 dl dt dd案例 dl dt dd总结 一. ...
- centos6.X安装jdk
1.查看Linux自带的JDK是否已安装(如果安装则卸载CentOS已安装的低版本) [root@localhost soft]# java -version java version "1 ...
- java之Spring(IOC)注解装配Bean详解
在这里我们要详细说明一下利用Annotation-注解来装配Bean. 因为如果你学会了注解,你就再也不愿意去手动配置xml文件了,下面就看看Annotation的魅力所在吧. 先来看看之前的bean ...
- java之Spring(AOP)前奏-动态代理设计模式(下)
在上一章我们看到了,新增的三种类都能实现对原始功能类进行添加功能的事务处理,这三种类就是一个代理. 但是这种代理是写死的,怎样实现对任意接口添加自定义的代理呢? 我们先来看一下之前的代理实现: pub ...
- php中的session_id详解
php中session_id()函数原型及说明session_id()函数说明:stringsession_id([string$id])session_id() 可以用来获取/设置 当前会话 ID. ...
- vs2015 key
vs2015 企业版 专业版 密钥 亲测可用 专业版:HMGNV-WCYXV-X7G9W-YCX63-B98R2企业版:HM6NR-QXX7C-DFW2Y-8B82K-WTYJV
- C#实现的HttpGet请求
话不多说,代码贴上: /// <summary> /// HTTP Get请求 /// </summary> /// <param name="url" ...
- Java核心卷笔记(一)
第三章Java基程序设计结构 1.注释 三种注释方式: // 注释单行 /* 内容 */ 注释单行 /** * 内容 */ 2. java 数据类型 Java数据类型可分为两种:基本数据类型和引用数据 ...
- CentOS7搭建LAMP实战
环境配置从官网下载稳定的源码包解压预编译编译编译安装启动服务 环境配置 # yum install -y vim wget links //安装一下基本工具# systemctl stop firew ...
- 使用ADO.NET操作数据库
如有转载的请注明出处!蟹蟹 1.1使用对象连接OLE DB 数据源 OLE DB 数据源包含具有OLE DB 驱动程序的任何数据源,如SQL Server.Access.Excel.Oracle等. ...