博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
bzoj3992
阅读量:5132 次
发布时间:2019-06-13

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

题解:

求模素数 p 原根的方法:对 p-1 进行素因子分解,记pi为p-1的第i个因子,若恒有a^((p-1)/pi) mod p ≠ 1  成立,则 a 就是 p 的原根。(对于合数求原根,只需把 p-1 换成 phi(p) 即可)

首先比较暴力是f[i][j]表示前i个,乘积为j

然后是n*m^2的

我们可以利用原根将每个数变成g^x

这样就变成了加和

可以利用生成函数的思想

然后分治+fft就可以了

代码:

#include 
using namespace std;#define rint register int#define rep(i,h,t) for(rint i=h;i<=t;i++)#define dep(i,t,h) for(rint i=t;i>=h;i--)#define IL inlineconst double pi=acos(-1.0);const int N=3e4;int n,m,l,r[N],a[N],b[N],w[N],c[N],g,kk,G=3;int p=1004535809;IL int fsp(int x,int y,int p){ int ans=1; while (y) { if(y&1) ans=1ll*ans*x%p; x=1ll*x*x%p; y>>=1; } return ans;}IL void jf(int &x,int y){ x+=y; if (x>p) x-=p;}IL void fft(int *a,int o){ rep(i,0,n-1) if (i>r[i]) swap(a[i],a[r[i]]); for (int i=1;i
p) x[k]-=p; } } } if (o==-1) { reverse(&a[1],&a[n]); for (int i=0,inv=fsp(n,p-2,p);i
>n>>m>>x>>s; kk=m-1; rep(i,1,s) cin>>a[i]; get_g(m); rep(i,0,m-2) f[fsp(g,i,m)]=i; m*=2; rep(i,1,s) if (a[i]) now.a[f[a[i]]]++,c[f[a[i]]]++; fsp2(n); cout<<(a[f[x]]+p)%p; return 0;}

 

转载于:https://www.cnblogs.com/yinwuxiao/p/9420653.html

你可能感兴趣的文章
c风格字符串函数
查看>>
python基础学习第二天
查看>>
java可重入锁reentrantlock
查看>>
浅谈卷积神经网络及matlab实现
查看>>
struts2学习(9)struts标签2(界面标签、其他标签)
查看>>
Android 导入jar包 so模块--导入放置的目录
查看>>
解决ajax请求cors跨域问题
查看>>
Android Studio
查看>>
zz 圣诞丨太阁所有的免费算法视频资料整理
查看>>
【大数模板】C++大数类 大数模板
查看>>
【123】
查看>>
《收获,不止Oracle》pdf
查看>>
用户权限设置
查看>>
java 之equals与"=="的区别
查看>>
LinkedList<E>源码分析
查看>>
学习微软 Excel 2002 VBA 编程和XML,ASP技术
查看>>
游戏开发常用算法
查看>>
Real-Time Rendering 笔记
查看>>
如何理解HTML结构的语义化
查看>>
Intellij IDEA(eclipse设置)常用快捷键
查看>>