博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
BZOJ 3992 DP+NTT+快速幂
阅读量:5875 次
发布时间:2019-06-19

本文共 1057 字,大约阅读时间需要 3 分钟。

思路:

普通的DP很好想吧

f[i][j]+=f[i-1][j*s[k]]  前i个数  mod m=j 的个数

 

m是质数  模数是质数  这就很有趣了

那么我们就求出来原根  所有的数都取指数

搞出生成函数

乘法就变成了加法

快速幂+$NTT$就好了

(注意特判零)

//By SiriusRen#include 
#include
#include
using namespace std;#define int long longconst int mod=1004535809;int N,M,X,S,n,L,s[8888],R[16385],fst[16385],b[16385],temp1[16385],temp2[16385],inv[8888],vis[8888],prime[8888],tot;int pow(int x,int y,int p){ int res=1; while(y){ if(y&1)res=res*x%p; x=x*x%p,y>>=1; }return res;}void NTT(int *a,int f){ for(int i=0;i
=M-1;i--)(c[i-M+1]+=c[i])%=mod,c[i]=0;}int get_root(){ for(int i=2;;i++){ for(int j=2;j*j<=M;j++)if((M-1)%j==0&&pow(i,(M-1)/j,M)==1)goto ed; return i;ed:; }}signed main(){ scanf("%lld%lld%lld%lld",&N,&M,&X,&S); for(n=1;n<=M*2;n<<=1)L++; for(int i=0;i
>1]>>1)|((i&1)<<(L-1)); int now=1,G=get_root(); for(int i=0;i
>=1; } printf("%lld\n",b[inv[X]]);}

  

转载于:https://www.cnblogs.com/SiriusRen/p/6592618.html

你可能感兴趣的文章
Highcharts使用表格数据绘制图表
查看>>
Thinkphp5笔记三:创建基类
查看>>
LNMP之编译安装PHP出现的问题
查看>>
hdu5373
查看>>
4.单链表的创建和建立
查看>>
testng生成报告 testng-xslt 美化测试报告
查看>>
Android 好看的搜索界面,大赞Animation
查看>>
查询反模式 - GroupBy、HAVING的理解
查看>>
[转]动态加载javascript
查看>>
【协议】5、gossip 协议
查看>>
基于配置文件的redis的主从复制
查看>>
hasura graphql 角色访问控制
查看>>
springmvc中controller内方法跳转forward?redirect?
查看>>
C#委托,事件理解入门 (译稿)转载
查看>>
容器的end()方法
查看>>
[转] Agile Software Development 敏捷软件开发
查看>>
HDU 1007 Quoit Design (最小点对,模板题)
查看>>
Windows Phone 7 自定义事件
查看>>
Objective-c 网址中带中文解决方法
查看>>
向函数传递数组的问题
查看>>