POJChallengeRound2 Guideposts 【单位根反演】【快速幂】
题目分析:
这题的目标是求$$ \sum_{i \in [0,n),k \mid i} \binom{n}{i}G^i $$
这个形式很像单位根反演。
单位根反演一般用于求:$ \sum_{i \in [0,n),k \mid i} \binom{n}{i}f(x)^i $
推理过程略,实际上也就是交换求和符号的事情。
接着就变成裸的矩阵快速幂了
代码:
1 #include<bits/stdc++.h> 2 using namespace std; 3 4 int m,k,p;long long n; 5 int l,s,t,gg; 6 7 struct mat{int arr[7][7];}G,bs,mmp; 8 vector<int> fac; // factor of p 9 10 void buildbase(int w){ 11 for(int i=1;i<=m;i++) 12 for(int j=1;j<=m;j++) bs.arr[i][j] = 1ll*w*G.arr[i][j]%p; 13 for(int i=1;i<=m;i++) bs.arr[i][i] ++,bs.arr[i][i] %= p; 14 } 15 16 mat operator*(mat alpha,mat beta){ 17 memset(mmp.arr,0,sizeof(mmp.arr)); 18 for(int k=1;k<=m;k++){ 19 for(int i=1;i<=m;i++){ 20 for(int j=1;j<=m;j++){ 21 mmp.arr[i][j] += 1ll*alpha.arr[i][k]*beta.arr[k][j]%p; 22 mmp.arr[i][j] %= p; 23 } 24 } 25 } 26 return mmp; 27 } 28 29 mat res; 30 mat fstpow(mat now,long long pw){ 31 memset(res.arr,0,sizeof(res.arr)); 32 for(int i=1;i<=m;i++) res.arr[i][i] = 1; 33 long long bit = 1; 34 while(bit <= pw){ 35 if(bit & pw){res = res*bs;} 36 bs = bs*bs;bit<<=1; 37 } 38 return res; 39 } 40 41 void init(){ 42 memset(G.arr,0,sizeof(G.arr)); 43 fac.clear(); 44 l = s = t = gg = 0; 45 } 46 47 void read(){ 48 scanf("%d%d%d",&l,&s,&t); 49 for(int i=1;i<=l;i++){ 50 int u,v; scanf("%d%d",&u,&v); 51 G.arr[u][v]++; 52 } 53 } 54 55 int fast_pow(int now,int pw){ 56 int ans = 1,dt = now,bit = 1; 57 while(bit <= pw){ 58 if(bit & pw){ans = 1ll*ans*dt%p;} 59 dt = 1ll*dt*dt%p; bit<<=1; 60 } 61 return ans; 62 } 63 64 void getgg(){ 65 int z = p-1; 66 for(int i=2;i*i<=z;i++){ 67 if(z % i == 0){ 68 fac.push_back(i); 69 while(z % i == 0) z /= i; 70 } 71 } 72 if(z != 1) fac.push_back(z); 73 for(int i=2;i<=p;i++){ 74 int flag = true; 75 for(int j=0;j<fac.size();j++){ 76 int z = fast_pow(i,(p-1)/fac[j]); 77 if(z == 1){flag = false; break;} 78 } 79 if(flag){gg = i;break;} 80 } 81 gg = fast_pow(gg,(p-1)/k); 82 } 83 84 void work(){ 85 int w = 1,ans = 0; 86 for(int i=0;i<k;i++,w = 1ll*w*gg%p){ 87 buildbase(w); 88 bs = fstpow(bs,n); 89 ans += bs.arr[s][t]; ans%=p; 90 } 91 ans = 1ll*ans*fast_pow(k,p-2)%p; 92 printf("%d\n",ans); 93 } 94 95 int main(){ 96 while(scanf("%d%lld%d%d",&m,&n,&k,&p) == 4){ 97 init(); 98 read(); 99 getgg(); 100 work(); 101 } 102 return 0; 103 }
转载于:https://www.cnblogs.com/Menhera/p/10394970.html
POJChallengeRound2 Guideposts 【单位根反演】【快速幂】相关推荐
- 【HNOI2019】白兔之舞【组合数学】【矩阵快速幂】【单位根反演】【Chirp Z-Transform】【原根】【MTT】
题意:有一张 (L+1)×n(L+1)\times n(L+1)×n 个点的有向图,每个结点有二元组 (x,y)(0≤x≤L,1≤y≤n)(x,y)~(0\leq x\leq L,1\leq y\le ...
- 【BZOJ3328】PYXFIB【矩阵快速幂】【单位根反演】【二项式定理】
传送门 题意: ∑i=0⌊nk⌋(nik)Fik\sum_{i=0}^{\lfloor\frac nk\rfloor}\binom n{ik}F_{ik}i=0∑⌊kn⌋(ikn)Fik FF ...
- 数学--数论--HDU 4675 GCD of Sequence(莫比乌斯反演+卢卡斯定理求组合数+乘法逆元+快速幂取模)
先放知识点: 莫比乌斯反演 卢卡斯定理求组合数 乘法逆元 快速幂取模 GCD of Sequence Alice is playing a game with Bob. Alice shows N i ...
- 【集训队作业2018】复读机【指数型生成函数】【单位根反演】【二项式定理】
传送门 单位根反演听着高级,其实没啥技术含量-- 本文是篇几乎没有证明的佛系讲解 单位根反演的式子长这样: 1n∑i=0n−1ωnik=[k∣n]\frac{1}{n}\sum_{i=0}^{n-1} ...
- [学习笔记] 单位根反演
单位根反演 [k∣n]=1k∑i=0k−1ωkin[k\mid n]=\frac 1k\sum_{i=0}^{k-1}\omega_k^{in}[k∣n]=k1∑i=0k−1ωkin kkk 次 ...
- UOJ#450. 【集训队作业2018】复读机 排列组合 生成函数 单位根反演
原文链接https://www.cnblogs.com/zhouzhendong/p/UOJ450.html 题解 首先有一个东西叫做"单位根反演",它在 FFT 的时候用到过: ...
- 【学习笔记】斯特林反演+单位根反演
upd:抄了一下 ppt \text{ppt} ppt. 1.1 1.1 1.1 斯特林反演 有两个恒等式: [ i = j ] = ∑ ( − 1 ) i − k [ i k ] { k j } [ ...
- 矩阵快速幂+构造方法
与快速幂一样,可以将递推式通过二进制的方式来进行优化,这个学了快速幂就是十分容易理解 大概的板子如下: struct mat///自己定义大小的矩阵 {ll m[11][11]; }; mat mul ...
- 【做题】SRM701 Div1 Hard - FibonacciStringSum——数学和式&矩阵快速幂
原文链接 https://www.cnblogs.com/cly-none/p/SRM701Div1C.html 题意:定义"Fibonacci string"为没有连续1的01串 ...
最新文章
- 淘淘经受了一次考验...
- 获取input数据_使用 PHP Masked Package 屏蔽敏感数据
- 后台返回给前端json字段的大小写问题,Lombok的坑
- loadrunner-3-1创建测试场景
- Linux进程管理:内核中的优先级继承互斥(rtmutex.h):防止优先级反转
- php多次登录失败,PHPCMS登录后台失败次数过多解决办法
- 相关滤波的视觉目标跟踪算法学习
- linux增加分区大小,新增硬盘扩容Linux下的分区大小
- 宿主机如何和虚拟机WinServer2008的网络互通
- 为前端工作者准备的几个炫彩的js动画库
- 发动机和变速箱工作原理
- python求组合数c(m、n)编程题_c语言编程问题,计算出从n 个不同元素中取出m 个元素(m≤n)的组合数。编写程序...
- 黑苹果13.0.1驱动RTL 8125B 2.5G网卡失败故障排查
- php制作个人简介代码_PHP制作用户注册系统的详细代码
- iphone热点蓝条闪烁
- Excel中利用vba将多个sheet合并在一个sheet中的方法
- TCP/IP 基本C/S模型
- 2023 年腾讯云服务器租用价格表出炉(CPU、内存、带宽、系统盘)
- 【navicat 密码查看】小技巧navicat 如何查看密码
- Spring容器的启动流程
热门文章
- linux什么用户什么任务,Linux 用户
- Anaconda详细安装及安装Scrapy框架
- img=img%3e128 matlab,Matlab中一般的数值计算和使用
- 收集一些非常实用的Linux命令
- Git rebase 和 Git merge 的区别,你知道吗?
- linux 本地yum 恢复,Linux_RHEL系统恢复安装光盘中的yum更新源的方法,安装光盘本地YUM更新源挂载安 - phpStudy...
- 提现接口网站 php,API提现接口
- 带wiringPi库的交叉编译
- 成年人的样子是什么样子_不只是看样子
- 同态加密应用_重新设计具有同态性的银行应用