传送门

题解:
观察下这个等式,其实就是fn=∑ifn−aif_n = \sum_{i}f_{n-a_i}fn​=∑i​fn−ai​​。

前面的求逆预处理一下,后面的特征多项式倍增和取模就行了,时间复杂度O(klog⁡klog⁡m)O(k \log k \log m)O(klogklogm)。

注意a1a_1a1​可能大于23333,RE了半天。。

#include <bits/stdc++.h>
using namespace std;const int RLEN=1<<18|1;
inline char nc() {static char ibuf[RLEN],*ib,*ob;(ib==ob) && (ob=(ib=ibuf)+fread(ibuf,1,RLEN,stdin));return (ib==ob) ? -1 : *ib++;
}
inline int rd() {char ch=nc(); int i=0,f=1;while(!isdigit(ch)) {if(ch=='-')f=-1; ch=nc();}while(isdigit(ch)) {i=(i<<1)+(i<<3)+ch-'0'; ch=nc();}return i*f;
}const int N=2e6+50, mod=104857601, lim=23333;
inline int add(int x,int y) {return (x+y>=mod) ? (x+y-mod) : (x+y);}
inline int dec(int x,int y) {return (x-y<0) ? (x-y+mod) : (x-y);}
inline int mul(int x,int y) {return (long long)x*y%mod;}
inline int power(int a,int b,int rs=1) {for(;b;b>>=1,a=mul(a,a)) if(b&1) rs=mul(rs,a); return rs;}namespace FFT {int w[N*8],pos[N*8],k;int A[N*8],B[N*8];inline void pre() {for(int bl=1,i=0;bl<=2e5;i+=bl,bl<<=1) {int wn=power(3,(mod-1)/bl/2);w[i]=1;for(int j=1;j<bl;j++) w[i+j]=mul(w[i+j-1],wn);}}inline void init(int nn) {for(k=1;k<=nn;k<<=1);for(int i=1;i<k;i++) pos[i]=(i&1) ? ((pos[i>>1]>>1)^(k>>1)) : (pos[i>>1]>>1);memset(A,0,sizeof(int)*k);memset(B,0,sizeof(int)*k);}inline void dft(int *a) {for(int i=1;i<k;i++) if(pos[i]>i) swap(a[pos[i]],a[i]);for(int bl=1,i=0;bl<k;i+=bl,bl<<=1) {int tl=bl<<1, wn=power(3,(mod-1)/tl);for(int bg=0;bg<k;bg+=tl)for(int j=0;j<bl;j++) {int &t1=a[bg+j], &t2=a[bg+j+bl], t=mul(t2,w[i+j]);t2=dec(t1,t); t1=add(t1,t);}}}inline void func() {dft(A); dft(B);for(int i=0;i<k;i++) B[i]=mul(A[i],B[i]);dft(B); reverse(B+1,B+k);const int inv=power(k,mod-2);for(int i=0;i<k;i++) B[i]=mul(B[i],inv);}
}
int n,a[N],A,B; long long m;
struct poly {vector <int> a;inline int deg() const {return a.size()-1;}poly(int d=0,int t=0) {a.resize(d+1); a[d]=t;}inline int& operator [](const int &b) {return a[b];}inline const int& operator [](const int &b) const {return a[b];}friend inline poly operator *(const poly &a,const poly &b) {FFT::init(a.deg()+b.deg());for(int i=0;i<=a.deg();i++) FFT::A[i]=a[i];for(int i=0;i<=b.deg();i++) FFT::B[i]=b[i];FFT::func(); poly c(a.deg()+b.deg(),0);for(int i=0;i<=c.deg();i++) c[i]=FFT::B[i];return c;}friend inline poly operator *(const poly &a,const int &b) {poly c=a; for(int i=0;i<=c.deg();i++) c.a[i]=mul(c.a[i],b);return c;  }friend inline poly operator -(const poly &a,const poly &b) {poly c(max(a.deg(),b.deg()));for(int i=0;i<=a.deg();i++) c[i]=a[i];for(int i=0;i<=b.deg();i++) c[i]=dec(c[i],b[i]);return c;}  friend inline poly operator +(const poly &a,const poly &b) {poly c(max(a.deg(),b.deg()));for(int i=0;i<=a.deg();i++) c[i]=a[i];for(int i=0;i<=b.deg();i++) c[i]=add(c[i],b[i]);return c;}inline poly calc_inv(poly f,int len) {if(len==1) return poly(0,power(f[0],mod-2));poly f0=calc_inv(f.extend(len>>1),len>>1);return (f0*2-(f0*f0).extend(len-1)*f).extend(len-1);}inline poly calc_inverse(int nn) {FFT::init(nn);return calc_inv(this->extend(nn),FFT::k).extend(nn);}inline poly rev() {poly c=*this; reverse(c.a.begin(),c.a.end()); return c;}friend inline poly operator %(const poly &a,const poly &b) {if(a.deg()<b.deg()) return a;poly A=a, B=b; int res=a.deg()-b.deg();A=A.rev().extend(res); B=B.rev().extend(res);poly C=B.calc_inverse(res);poly D=(A*C).extend(res).rev(); return (a-b*D).extend(b.deg()-1);}inline void dg() {if(!deg()) a[0]=0;else {for(int i=0;i<deg();i++) a[i]=mul(i+1,a[i+1]);a.pop_back();}}inline poly extend(int nn) {poly c=*this;c.a.resize(nn+1);return c;}inline int getval(int x) {int res=0, w=1;for(int i=0;i<=deg();i++)res=add(res,mul(w,a[i])), w=mul(w,x);return res;}
};int main() {FFT::pre();cin>>n>>m;cin>>a[1]>>A>>B;for(int i=2;i<=n;i++) a[i]=((long long)a[i-1]*A+B)%lim+1;poly g(lim,0);for(int i=1;i<=n;i++) if(a[i]<=lim) g[a[i]]++;poly f(0,1);f=(f-g).calc_inverse(lim);g=poly(lim,1);for(int i=1;i<=n;i++) if(a[i]<=lim) g[lim-a[i]]--;poly rs(0,1), h(1,1);for(;m;m>>=1,h=h*h%g)if(m&1) rs=rs*h%g;int ans=0;for(int i=0;i<=lim && i<=rs.deg();i++)ans=add(ans,mul(rs[i],f[i]));cout<<ans<<'\n';
}

51nod1538: 一道难题(特征多项式+多项式取模/求逆)相关推荐

  1. LeetCode 974. Subarray Sums Divisible by K--Python解法--数学题--取模求余

    LeetCode 974. Subarray Sums Divisible by K–Python解法–数学题–取模求余 LeetCode题解专栏:LeetCode题解 LeetCode 所有题目总结 ...

  2. Codeforces Round #104 (Div. 2) E DP(01背包模型) +组和+除法取模求逆元

    题意: 规定只包含4或7的数为幸运数字,给定n个数的序列,求他的子序列,使得该子序列的长度为k并且满足该子序列中不存在相同的两个幸运数字.问一共寻在多少种可能.(只要该数的下标不同则认为是不同的序列) ...

  3. 多项式除法,多项式取模

    多项式除法 给定一个nnn次多项式F(x)F(x)F(x)和mmm次多项式G(x)G(x)G(x),要求R(x),Q(x)R(x), Q(x)R(x),Q(x),满足F(x)=R(x)G(x)+Q(x ...

  4. 多项式的求逆、取模和多点求值学习小记

    最近学习了多项式的求逆.取模和多点求值,这些方法能够解决很多多项式问题. 这三个操作是环环相扣的,很有趣,学完后不妨记录一下. 多项式求逆 给出一个次数界为 nnn 的多项式 A(x)A(x)A(x) ...

  5. 多项式求逆与多项式除法/取模

    多项式求逆 Procedure 多项式求逆是多项式模块中的一个重要操作("操作"这个词看出如今多项式题是多么的工业化,犹如毒瘤8操作LCT),在做生成函数/多项式除法.多项式取模/ ...

  6. Happy 2004(积性函数、快速幂取模、费马小定理、求因数和)

    happy 2004 题目 积性函数 求因数和 费马小定理 定理 取模 加减法 乘法 除法 结论 推导 快速幂取模 快速幂 快速幂取模 题目代码 坑点 题目 Consider a positive i ...

  7. c语言float可以 取余吗,C语言fmod()函数:对浮点数取模(求余)

    头文件:#include fmod() 用来对浮点数进行取模(求余),其原型为: double fmod (double x); 设返回值为 ret,那么 x = n * y + ret,其中 n 是 ...

  8. 关于取模运算(mod)和求余(rem)运算

    通常情况下取模运算(mod)和求余(rem)运算被混为一谈,因为在大多数的编程语言里,都用'%'符号表示取模或者求余运算.在这里要提醒大家要十分注意当前环境下'%'运算符的具体意义,因为在有负数存在的 ...

  9. c语言fmod函数6,C语言fmod()函数:对浮点数取模(求余)

    头文件:#include fmod() 用来对浮点数进行取模(求余),其原型为: double fmod (double x); 设返回值为 ret,那么 x = n * y + ret,其中 n 是 ...

  10. c语言fmod英文全称,C语言fmod()函数:对浮点数取模(求余)(示例代码)

    头文件:#include fmod() 用来对浮点数进行取模(求余),其原型为: double fmod (double x); 设返回值为 ret,那么 x = n * y + ret,其中 n 是 ...

最新文章

  1. Manifest merger failed Suggestion: add 'tools:replace=“Android:value”' to meta-data element at And
  2. python运行py文件 sublime 快捷键_Sublime Text配置python以及快捷键总结
  3. 插入节点insertBefore()
  4. .NET Core 3.0之深入源码理解Kestrel的集成与应用(一)
  5. Vim案列掌握vim的基本操作——案例一:vim创建编写txt文件
  6. LeetCode之最大正方形
  7. 用c语言 c 做8位数奇校验,计算机硬件技术基础网上作业及答案
  8. 软件工程生命周期模型_软件生命周期模型比较| 软件工程
  9. 自建radius服务器,Radius服务器搭建
  10. 大学用什么python教材_Python开发基础 大学教材
  11. 使用cntv(原cctvbox-中国网络电视台)下载视频
  12. 2020年书法落款_书法落款的基本常识最新版
  13. 【论文阅读笔记】用于真实图像超分辨率的一种局部判别学习方法(LDL)
  14. 《计算机网络基础》笔记 -----应用层(六)
  15. 在安装虚拟机时,”intel vt-x 处于禁用状态“ 如何解决
  16. java计算机毕业设计郑工社团交流服务信息平台源码+mysql数据库+系统+lw文档+部署
  17. 计算机网络词汇解释(一)——网络协议体系
  18. JS节点操作、节点层级获取
  19. 香农编码C程序及演示结果
  20. 花生日记,购物省钱还能赚钱,淘宝天猫优惠券一网打尽!2018,你还打算将错就错继续做微商吗?...

热门文章

  1. 计算机主板 也叫系统板或母版,电脑主板与CPU常见故障维修
  2. 【业务分析】为什么YouTube广告只看5秒就可跳过,却更赚钱?
  3. CBAM、通道注意力、空间注意力学习
  4. 计算机专业英语教程ppt,计算机专业英语教程课件.ppt
  5. 【现已失效】【转载】QQ空间一键点赞方法
  6. 【板栗糖GIS】联想win11如何解决浏览器edge默认页面无法修改的问题
  7. 基于深度学习的移动网络异常检测
  8. 12-搜索前端开发-按分类搜索
  9. 如何通过两步验证来保护您的Apple ID
  10. Vulnhub--BlueSky:1