[SDOI2015] 序列统计 题解

乘法并不容易用 FFT 或 NTT 维护,考虑在模意义下化乘为加。

化乘为加主要有两种方法:\(\log\)\(\gamma\)(指标),由于在取模意义下,所以使用后者。

那剩下的部分就是快速幂,用 NTT 加速即可。时间复杂度 \(O(m\log m\log n)\)

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=50005,p=1004535809;
namespace NTT{int rev[N],mx,k,m,qp,h;struct dft{int fg[N];};int qpow(int x,int y,int p){int re=1;while(y){if(y&1) re=re*x%p;x=x*x%p,y>>=1;}return re;}void init(int n){mx=1,k=0,rev[0]=0,h=m-1;while(mx<=n) mx*=2,k++;for(int i=0;i<mx;i++)rev[i]=(rev[i>>1]>>1)|((i&1)<<(k-1));qp=qpow(mx,p-2,p);}void fmd(dft &a){for(int i=m-1;i<mx;i++) if(a.fg[i])a.fg[i%h]=(a.fg[i%h]+a.fg[i])%p,a.fg[i]=0;}void ntt(dft &a,int fl){for(int i=0;i<mx;i++)if(i<rev[i]) swap(a.fg[i],a.fg[rev[i]]);for(int i=1;i<mx;i*=2){int om=qpow(fl?3:(p+1)/3,(p-1)/(i<<1),p);for(int j=0,w=1;j<mx;j+=i*2,w=1)for(int k=j;k<j+i;k++,w=w*om%p){int x=a.fg[k],y=w*a.fg[k+i]%p;a.fg[k]=(x+y)%p,a.fg[k+i]=(x-y+p)%p;}}if(fl) return;for(int i=0;i<mx;i++)a.fg[i]=a.fg[i]*qp%p;}
}using namespace NTT;
int n,ed,ln,g,ru[N];
dft re,now;vector<int>pr;
int prirt(int x){x--;int cc=x;for(int i=2;i*i<=x;i++){if(cc%i==0) pr.push_back(i);while(cc%i==0) cc/=i;if(cc==1) continue;}if(cc>1) pr.push_back(cc);for(int i=1,fl=1;i<=x;i++,fl=1){for(auto j:pr)if(qpow(i,x/j,m)==1){fl=0;break;}if(fl) return i;}return 0;
}signed main(){ios::sync_with_stdio(0);cin.tie(0),cout.tie(0);cin>>n>>m>>ed>>ln,init(m*2);re.fg[0]=1,g=prirt(m);for(int i=1,mi=1;i<m;i++)ru[mi]=i-1,mi=mi*g%m;for(int i=1,x;i<=ln;i++){cin>>x;if(!x) continue;now.fg[ru[x]]=1;}while(n){ntt(now,1);if(n&1){ntt(re,1);for(int i=0;i<mx;i++)re.fg[i]=re.fg[i]*now.fg[i]%p;ntt(re,0),fmd(re);}for(int i=0;i<mx;i++)now.fg[i]=now.fg[i]*now.fg[i]%p;ntt(now,0),fmd(now),n>>=1;}cout<<re.fg[ru[ed]];return 0;
}

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

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

相关文章

Mac电脑如何卸载软件?App Cleaner

Mac电脑如何卸载软件?App Cleaner 垃圾清理 App Cleaner & Uninstaller Pro Mac,是一款Mac卸载工具,残余垃圾清除工具!可以卸载应用程序或只删除不需要的服务文件,甚至可以删除以前删除的应用程序中的文件。使用该应用程序,您可以管理Mac扩展程序并使用一个按钮禁用所…

20 GitHub 仓库帮助你成为 React专家

原文:https://dev.to/martinadamsdev/20-github-repositories-to-become-a-react-master-opl#how-to-become-a-react-master-1推荐的 GitHub 仓库列表:reactjs/reactjs.org:官方 React 文档,提供了详细的学习指南和示例代码。facebook/react:React 的官方仓库,包含了核心…

WebStorm 2024.3.1 前端开发工具

WebStorm 2024.3.1 前端开发工具 JetBrains WebStorm 2024 mac,是一款JavaScript开发工具,WebStorm 非常了解您的项目结构,可以在编码的各个方面提供帮助。它将自动补全代码,检测错误和冗余并提出修正建议,帮助您安全地重构代码。

MySQL数据库开启远程访问权限

1、背景描述 默认情况下,MySQL 只允许本地登录,即只能在安装 MySQL 数据库所在的主机环境中访问。 在实际开发和使用中,一般需要访问远程服务器的数据库,此时就需要开启服务器端 MySQL 的远程访问权限。 2、查看MySQL的用户表如上图所示,Host 列指定了允许用户登录所使用的…

如何高效且安全地进行网站页面模板的修改?

在现代网站建设中,页面模板的修改是提升用户体验、优化SEO排名以及保持网站美观度的重要手段。以下是详细的步骤:备份现有模板:在开始任何修改之前,请确保已经对当前使用的模板进行了完整备份。这可以防止意外错误导致的数据丢失。 选择合适的编辑工具:根据所用的内容管理…

掌握这些技巧,让你轻松应对网站模板修改中的常见挑战

注意事项 解释遵循最佳实践 始终按照官方文档推荐的方式来进行修改,避免直接编辑核心文件,以减少升级时出现问题的风险。考虑SEO影响 模板中的元标签、标题标签等元素直接影响搜索引擎抓取效率,因此在修改时要格外小心,确保不会破坏原有SEO设置。维护一致性 整个网站应该保…

如何修改网站首页背景?

修改网站首页背景可以通过CSS或HTML实现。以下是具体步骤:使用CSS修改背景:打开网站的CSS文件(通常是style.css)。 找到控制背景的CSS规则,例如:body {background-image: url(images/background.jpg);background-size: cover;background-repeat: no-repeat; }修改backgro…

网站修改与上传的步骤

网站修改与上传的步骤如下:首先,确定需要修改的内容,并在本地开发环境中进行修改。可以使用文本编辑器或集成开发环境(IDE)来编辑网站文件。修改完成后,进行本地测试,确保修改后的网站功能和性能正常。然后,将修改后的文件上传到服务器。可以使用FTP客户端或服务器管理…

网站首页源码修改后不变的处理方法

网站首页源码修改后不变可能是由于缓存或编译问题导致的。首先,尝试清除浏览器缓存和网站缓存。可以在浏览器中按下Ctrl+Shift+Delete组合键,选择清除缓存选项,然后刷新网站。如果问题仍然存在,可能是服务器端缓存或编译的问题。可以尝试重启服务器或清除服务器缓存。如果使…

怎么修改自己公司的网站:全面更新网站内容和设计

问题描述 修改自己公司的网站可以帮助提升品牌形象和用户体验。这通常涉及更新网站内容、设计和功能。 解决方案规划修改内容制定详细的修改计划,包括需要更新的内容、设计元素、功能模块等。备份现有数据在进行任何修改之前,请确保已经完整备份了当前的网站数据。登录后台管…

如何使用Adobe Dreamweaver工具修改网站代码,确保网站正常运行?

Adobe Dreamweaver是一款强大的网页设计和开发工具,适合初学者和专业人士使用。以下是使用Dreamweaver修改网站代码的详细步骤和注意事项:安装Dreamweaver:首先,下载并安装Adobe Dreamweaver软件。确保安装过程中选择正确的安装选项。 连接到服务器:打开Dreamweaver,点击…