jzoj4051-序列统计【NTT】

正题

题目链接:https://jzoj.net/senior/#contest/show/3017/2


题目大意

求有多少个长度为nnn的序列使得

  1. 都是在集合SSS中的数
  2. 这些数的乘积%m=x\% m=x%m=x

解题思路

fi,jf_{i,j}fi,j表示长度为iii的序列,乘积为jjj的有多少个,显然有
fi,j∗w%m=fi−1,j(w∈S)f_{i,j*w\%m}=f_{i-1,j}(w\in S)fi,jw%m=fi1,j(wS)
然后有
f2∗i,j=∑a∗b%m=jfi,a∗fi,bf_{2*i,j}=\sum_{a*b\%m=j}f_{i,a}*f_{i,b}f2i,j=ab%m=jfi,afi,b

此时我们可以用矩阵乘法做到O(m3log⁡n)O(m^3\log n)O(m3logn)

但是此复杂度显然无法胜任本题

因为mmm是质数,所以对于1∼m−11\sim m-11m1都可以用一个gi%mg^i\% mgi%m表示出来,我们枚举找出一个ggg后,就有
fi,jf_{i,j}fi,j表示长度为iii的序列,乘积为gj%mg_j\%mgj%m的有多少个
那么就有f2∗i,j=∑(a+b)%m=jfi,a∗fi,bf_{2*i,j}=\sum_{(a+b)\%m=j}f_{i,a}*f_{i,b}f2i,j=(a+b)%m=jfi,afi,b

这很显然是一个卷积的形式,所以我们表示出一个多项式后用NTTNTTNTT做快速幂即可。

时间复杂度:O(mlog⁡mlog⁡n):O(m\log m\log n):O(mlogmlogn)


codecodecode

#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const ll N=5e4+10,XJQ=1004535809;
ll n,m,z,s,d[N],cnt,len,invn;
ll f[N],ans[N],tmp1[N],tmp2[N],r[N];
bool v[N];
ll power(ll x,ll b,ll p){ll ans=1;while(b){if(b&1)ans=ans*x%p;x=x*x%p;b>>=1;}return ans;
}
ll FindRoot(){ll l=m-1;for(ll i=2;i*i<=l;i++){if(l%i==0){d[++cnt]=i;while(l%i==0)l/=i;}}if(l!=1) d[++cnt]=l;l=m-1;for(ll i=2;i<=l;i++){bool flag=1;for(ll j=1;j<=cnt;j++)if(power(i,l/d[j],m)==1){flag=0;break;}if(flag) return i;}return 0;
}
void NTT(ll *x,ll op){for(ll i=0;i<len;i++)if(i<r[i])swap(x[i],x[r[i]]);for(ll p=2;p<=len;p<<=1){ll l=p>>1,tmp=power(3,(XJQ-1)/p,XJQ);if(op==-1)tmp=power(tmp,XJQ-2,XJQ);for(ll k=0;k<len;k+=p){ll buf=1;for(ll i=k;i<k+l;i++){ll tt=buf*x[l+i]%XJQ;x[l+i]=(x[i]-tt+XJQ)%XJQ;x[i]=(x[i]+tt)%XJQ;buf=buf*tmp%XJQ;}}}if(op==-1)for(int i=0;i<len;i++)x[i]=x[i]*invn%XJQ;
}
void mul(ll *a,ll *b){for(ll i=0;i<len;i++)tmp1[i]=a[i],tmp2[i]=b[i];NTT(tmp1,1);NTT(tmp2,1);for(ll i=0;i<len;i++)tmp1[i]=tmp1[i]*tmp2[i]%XJQ;NTT(tmp1,-1);for(ll i=0;i<m-1;i++)a[i]=(tmp1[i]+tmp1[i+m-1])%XJQ;
}
int main()
{ll z0;scanf("%lld%lld%lld%lld",&n,&m,&z0,&s);ll root=FindRoot();for(ll i=1;i<=s;i++){ll x;scanf("%lld",&x);v[x]=1;}for(ll i=0,x=1;i<m-1;i++,x=x*root%m){if(v[x])f[i]=1;if(x==z0)z=i;}for(len=1;len<=(m-1)<<1;len<<=1);for(ll i=0;i<len;i++)r[i]=(r[i>>1]>>1)|((i&1)?len>>1:0);ans[0]=1;invn=power(len,XJQ-2,XJQ);while(n){if(n&1)mul(ans,f);mul(f,f);n>>=1;}printf("%lld",ans[z]);
} 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/321420.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

玩Docker只要浏览器就够了,PWD是个神奇的网站

本文是d4d系列的第9篇&#xff0c;在这一篇中给大家介绍一个学习Docker最为快捷高效的方式&#xff0c;你不需要自己搭建环境&#xff0c;也不用担心把自己的开发环境搞乱&#xff0c;你需要的只是一个浏览器&#xff0c;就可以立即开始学习Docker的常用命令&#xff1b;你甚至…

【树形DP】没有上司的晚会 (ssl 1607)

没有上司的晚会没有上司的晚会没有上司的晚会 Description Ural大学有N个职员&#xff0c;编号为1~N。他们有从属关系&#xff0c;也就是说他们的关系就像一棵以校长为根的树&#xff0c;父结点就是子结点的直接上司。每个职员有一个快乐指数。现在有个周年庆宴会&#xff0c…

8、mybatis中的sql映射文件详解(3)

对于初学者&#xff0c;如何进行mybatis的学习呢&#xff1f;我总结了几点&#xff0c;会慢慢的更新出来。首先大家需要了解mybatis是什么、用mybatis来做什么、为什么要用mybatis、有什么优缺点&#xff1b;当知道了为什么的时候就开始了解如何用的问题&#xff0c;如何使用my…

P3159-[CQOI2012]交换棋子【费用流】

正题 题目链接:https://www.luogu.com.cn/problem/P3159 题目大意 n∗mn*mn∗m的棋盘&#xff0c;每个格子有黑子或白子&#xff0c;每次可以交换两个位置的棋&#xff0c;给出起始态和最终态和每个格子参与交换的最多次数。 求最少交换次数。 解题思路 这里只把白色棋子算作…

[系统安全]使用OD编写连连看外挂

文档下载地址&#xff1a;https://pan.baidu.com/s/1hrzzerq

2018 .NET开发者调查报告: .NET Core 是怎么样的状态

4月28日&#xff0c;在公众号里发起《.NET Core 使用调查》&#xff0c;该调查为期一周&#xff0c;有近3300名开发者参与&#xff0c;统计下结果供你的决策参考。已经使用.net core 的人数只有44%&#xff0c;计划使用.net core 比例达到48%&#xff0c; 没有计划去使用.net …

【动态规划】【递归】取数字问题 (ssl 1644)

取数字问题取数字问题取数字问题 Description 给定M*N的矩阵&#xff0c;其中的每个元素都是-10到10之间的整数。你的任务是从左上角&#xff08;1&#xff0c;1&#xff09;走到右下角&#xff08;M&#xff0c;N&#xff09;&#xff0c;每一步只能向右或向下&#xff0c;并…

9、mybatis中动态sql的使用

对于初学者&#xff0c;如何进行mybatis的学习呢&#xff1f;我总结了几点&#xff0c;会慢慢的更新出来。首先大家需要了解mybatis是什么、用mybatis来做什么、为什么要用mybatis、有什么优缺点&#xff1b;当知道了为什么的时候就开始了解如何用的问题&#xff0c;如何使用my…

软件质量保证划重点期末复习总结

软件质量保证复习总结大纲及问题 Module1 《软件工程实践》 1、软件工程实践通过解决问题的根源来指导软件开发。 2、软件工程实践之间相辅相成。 3、过程指导一个团队在什么时候做什么以及如何做。 4、软件工程过程为实现软件工程实践提供了上下文和支持。 Module2 《软件…

P4721-[模板]分治FFT【NTT,分治】

正题 题目链接:https://www.luogu.com.cn/problem/P4721 题目大意 给出序列ggg&#xff0c;然后f01f_01f0​1 fi∑j1ifi−jgjf_{i}\sum_{j1}^if_{i-j}g_jfi​j1∑i​fi−j​gj​ 求序列fff 解题思路 使用分治后用NTTNTTNTT计算前区间对后区间的贡献即可。 时间复杂度O(nlo…

Microsoft Build 2018 直播来啦!

一年一度的Microsoft Build大会又来啦&#xff01;Microsoft Build是微软面向全球开发者、合作伙伴以及消费者介绍其重要产品在未来一年内发展方向的技术盛会。而今年的Microsoft Build 2018大会是微软巨大蜕变、最彻底组织变革后的第一次前沿技术大会。更多了解&#xff0c;请…

【动态规划】矩阵链相乘 (ssl 1596)/能量项链 (ssl 2006)

矩阵链相乘{\color{Cyan} 矩阵链相乘 }矩阵链相乘 Description Input n表示矩阵的个数(<100) n1个数,表示矩阵(<100) Output 最小的乘法次数 Sample Input 5 5 10 4 6 10 2 Sample Output 348 题目大意&#xff1a; 有n个矩阵&#xff0c;输入n1个数&#x…

10、mybatis中缓存的使用

对于初学者&#xff0c;如何进行mybatis的学习呢&#xff1f;我总结了几点&#xff0c;会慢慢的更新出来。首先大家需要了解mybatis是什么、用mybatis来做什么、为什么要用mybatis、有什么优缺点&#xff1b;当知道了为什么的时候就开始了解如何用的问题&#xff0c;如何使用my…

C#编译器优化那点事

使用C#编写程序&#xff0c;给最终用户的程序&#xff0c;是需要使用release配置的&#xff0c;而release配置和debug配置&#xff0c;有一个关键区别&#xff0c;就是release的编译器优化默认是启用的。优化代码开关即optimize开关&#xff0c;和debug开关一起&#xff0c;有以…

P3195-[HNOI2008]玩具装箱【斜率优化dp】

正题 题目链接:https://www.luogu.com.cn/problem/P3195 题目大意 nnn个物品&#xff0c;分成若干段&#xff0c;每一段的长度为j−i∑ilrCkj-i\sum_{il}^rC_kj−i∑ilr​Ck​&#xff0c;打包价格为(长度−L)2(长度-L)^2(长度−L)2 求最小价格和。 解题思路 si∑j1iCjs_i\su…

【动态规划】书的复制 (ssl 1203)

书的复制书的复制书的复制 Description 现在要把m本有顺序的书分给k个人复制&#xff08;抄写&#xff09;&#xff0c;每个人的抄写速度都一样&#xff0c;一本书不允许分给两个或两个以上的人抄写&#xff0c;分给每个人的书&#xff0c;必须是连续的&#xff0c;比如不能把…

P1975-[国家集训队]排队【树状数组套线段树】

正题 题目链接:https://www.luogu.com.cn/problem/P1975 题目大意 一个nnn个数字的序列&#xff0c;每次交换两个数&#xff0c;求逆序对。 解题思路 显然交换lll和rrr的话对[1..l−1][1..l-1][1..l−1]和[r1,n][r1,n][r1,n]是不会有影响的&#xff0c;所以我们只需要考虑ll…

【动态规划】分组背包 (ssl 2291)

分组背包分组背包分组背包 Description 有N件物品和一个容量为V的背包。第i件物品的费用是c[i]&#xff0c;价值是w[i]。这些物品被划分为若干组&#xff0c;每组中的物品互相冲突&#xff0c;最多选一件。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量&#…

如何在Visual Studio 2017中使用C# 7+语法

前言之前不知看过哪位前辈的博文有点印象C# 7控制台开始支持执行异步方法&#xff0c;然后闲来无事&#xff0c;搞着&#xff0c;搞着没搞出来&#xff0c;然后就写了这篇博文&#xff0c;不喜勿喷&#xff0c;或许对您有帮助。在Visual Studio 2017配置支持C# 7语法心想都VS20…

11、mybatis的功能架构分析

1、Mybatis功能架构 1&#xff09;API接口层&#xff1a;提供给外部使用的接口API&#xff0c;开发人员通过这些本地API来操纵数据库。接口层一接收到调用请求就会调用数据处理层来完成具体的数据处理。 2&#xff09;数据处理层&#xff1a;负责具体的SQL查找、SQL解析、SQL执…