「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个相邻球的编号之和为完全平方数. 试设计一个算法 ...
随机推荐
- 飞鱼相册笔记(1)----外置SD卡文件夹名称不区分大小写
飞鱼相册笔记(1)----外置SD卡文件夹名称不区分大小写 在飞鱼相册发布的第一个测试版中,很多用户表示无法查看外置SD卡中的照片.乍一听觉得加个外置SD卡的根目录,然后在扫描所有图片的时候把这个根目 ...
- XSS攻击过滤处理
关于XSS攻击 XSS是一种经常出现在web应用中的计算机安全漏洞,它允许恶意web用户将代码植入到提供给其它用户使用的页面中. XSS漏洞的危害 网络钓鱼,包括盗取各类用户账号: 窃取用户cooki ...
- RHEL7.0 Docker离线安装以及实战笔记
1.概述 最近在琢磨一个事--在RHEL 7.0系统上离线安装使用Docker.然后配置JAVAEE环境,发布Web服务.在网上查了资料,大多数是在线安装的,其他的要么是环境不同,要么资料包找不到了. ...
- JeeSite
JeeSite是一个 开源的企业信息管理系统 基础框架.主要定位于"企业信息管理"领域,可用作企业信息管理类系统.网站后台管理类系统等.JeeSite是非常强调开发的高效性.健壮性 ...
- Linux下编译安装BOOST
linux平台下要编译安装除gcc和gcc-c++之外,还需要两个开发库:bzip2-devel 和python-devel,因此在安装前应该先保证这两个库已经安装: #yum install gcc ...
- html标签分类
在这里做个存档吧,区分一下常用的html标签,行内元素.块状元素.行内块状元素! 那个h标签下面的三横是<hr>标签. 顺便给个附加的css,你们仔细体会一下 body *{border: ...
- NewLife.Net——网络压测单机1.88亿tps
NewLife.Net压力测试,峰值4.2Gbps,50万pps,消息大小24字节,消息处理速度1.88亿tps! 共集合20台高配ECS参与测试,主服务器带宽6Gbps.100万pps,16核心64 ...
- Beta 冲刺day3
1.昨天的困难,今天解决的进度,以及明天要做的事情 昨天的困难:昨天主要是对第三方与企业复杂的逻辑关系进行分析和优化,以及进行部分模块的功能测试和代码测试. 今天解决的进度:根据前天得到的需求问题进行 ...
- leetCode刷题(找到两个数组拼接后的中间数)
There are two sorted arrays nums1 and nums2 of size m and n respectively. Find the median of the two ...
- hi-nginx-javascript vs node.js
hi-nginx-1.4.9已经支持javascript,这意味着把javascript应用于后端开发,将不再只有nodejs这唯一的途径和方法.由于java本身对javascript的极好支持,使得 ...