题目大意:

  传送门

  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 循环卷积的更多相关文章

  1. 「Codechef April Lunchtime 2015」Palindromeness

    「Codechef April Lunchtime 2015」Palindromeness 解题思路 : 考虑对于回文子串 \(s\) 贡献的定义: \[ value_s = [\ s[1,\lflo ...

  2. 对于前端,「微信小程序」其实不美好

    微信小程序开放公测了,9月底我曾经写过一篇 「微信小程序」来了,其中最后一句:"谢天谢地,我居然还是个前端". 这种火爆的新事物总是令人激动,感谢这个时代. 但是,当我真作为开发者 ...

  3. macOS安装「oh my zsh」

    目前常用的 Linux 系统和 OS X 系统的默认 Shell 都是 bash,但是真正强大的 Shell 是深藏不露的 zsh, 这货绝对是马车中的跑车,跑车中的飞行车,史称『终极 Shell』, ...

  4. 报名|「OneAPM x DaoCloud」技术公开课:Docker性能监控!

    如今,越来越多的公司开始 Docker 了,「三分之二的公司在尝试了 Docker 后最终使用了它」,也就是说 Docker 的转化率达到了 67%,同时转化时长也控制在 60 天内. 既然 Dock ...

  5. 企业运营对 DevOps 的「傲慢与偏见」

    摘要:出于各种原因,并非所有人都信任 DevOps .有些人觉得 DevOps 只不过给开发者改善产品提供了一个途径而已,还有的人觉得 DevOps 是一堆悦耳的空头支票,甚至有人认为 DevOps ...

  6. 「前端开发者」如何把握住「微信小程序」这波红利?

    由于前两周一直在老家处理重要事情,虽然朋友圈被「微信小程序」刷爆了,但并没有时间深入了解. 昨天回广州之后,第一件事情就是把「微信小程序」相关的文章.开发文档.设计规范全部看了一遍,基本上明白了「微信 ...

  7. 「花田对」CSDN程序员专场——谁来拯救技术宅!_豆瓣

    「花田对」CSDN程序员专场--谁来拯救技术宅!_豆瓣 「花田对」CSDN程序员专场--谁来拯救技术宅!

  8. Objective-C 实用关键字详解1「面试、工作」看我就 🐒 了 ^_^.

    在写项目 或 阅读别人的代码(一些优秀的源码)中,总能发现一些常见的关键字,随着编程经验的积累大部分还是知道是什么意思 的. 相信很多开发者跟我当初一样,只是基本的常用关键字定义属性会使用,但在关键字 ...

  9. LOJ6003 - 「网络流 24 题」魔术球

    原题链接 Description 假设有根柱子,现要按下述规则在这根柱子中依次放入编号为的球. 每次只能在某根柱子的最上面放球. 在同一根柱子中,任何2个相邻球的编号之和为完全平方数. 试设计一个算法 ...

随机推荐

  1. (WPS) 网络地理信息处理服务

    WPS 标准为网络地理信息处理服务提供了标准化的输入和输出. OGC® Web Processing Service (WPS) 标准描述了如何通过远程的任何算法和模型处理获得地理空间的栅格或矢量信息 ...

  2. int类型被强制转换成较低精度的byte类型

    公司的项目上线之前会进行代码合规性检查,其中很容易违反的一个规则就是“不要把原始类型转换成较低的精度”,实际开发的过程中,很多方法在处理数据时,尤其在做移位操作的时候,难免要把int类型转换成byte ...

  3. HP-Socket快速入门:分包、粘包解析

    环境配置 vs2015 windows7 64位 hp-socket 5.0 安装hp-socket 新建控制台项目TelnetServer,打开Nuget管理工具,搜索hp-socket: 安装成功 ...

  4. javaScript(3)---语法、关键保留字及变量

    学习要点: 1.语法构成 2.关键字保留字 3.变量 任何语言的核心都必然会描述这门语言最基本的工作原理.而JavaScript的语言核心就是ECMAScript 一.语法构成 区分大小写:ECMAS ...

  5. PBCS项目总结

    PBCS项目已经成功地Product,终于可以缓解一下紧张的心情,最近连续四五个月紧张地工作,头都要大了.如今比较清闲,是时候总结一下整个项目了.(古人云:成功在于总结嘛) 整个项目是二个人开发的,由 ...

  6. 2010_3_1最新 完整 FFMPEG 编译详解

    在网上看了很多编译详解,都很零散.经过自己的编译,解决一些BUG,在此分享自己的一些经验... 话不多说了!直接上贴. 第一步:准备编译平台. 需要 一个 MinGW 和 一个 MSYS 安装包 以及 ...

  7. Linux 下常用的Shell 命令

    英文原文链接:https://www.lopezferrando.com/30-interesting-shell-commands/ 1. 监控命令(每2秒运行一次) watch "ls ...

  8. JavaScript教程大纲

    因为考虑到Python的接受难度,改为推广较为简单和流行的JavaScript.先列主要参考资料:         JavaScript权威指南(第6版):http://book.douban.com ...

  9. Tomcat中常见线程说明

    http://blog.csdn.NET/jeff_fangji/article/details/41786205 本文讲述了Tomcat的常见线程的功能.名称.线程池和配置等信息,其中源码来自于To ...

  10. 在WinForm应用程序中快速实现多语言的处理

    在国际化环境下,越来越多的程序需要做多语言版本,以适应各种业务需求的变化.在Winform应用程序中实现多语言也有常规的处理方式处理,不过需要针对每个语言版本,重新修改Winform界面的显示,对一些 ...