题目分析:

这题的目标是求$$ \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 【单位根反演】【快速幂】相关推荐

  1. 【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 ...

  2. 【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 ...

  3. 数学--数论--HDU 4675 GCD of Sequence(莫比乌斯反演+卢卡斯定理求组合数+乘法逆元+快速幂取模)

    先放知识点: 莫比乌斯反演 卢卡斯定理求组合数 乘法逆元 快速幂取模 GCD of Sequence Alice is playing a game with Bob. Alice shows N i ...

  4. 【集训队作业2018】复读机【指数型生成函数】【单位根反演】【二项式定理】

    传送门 单位根反演听着高级,其实没啥技术含量-- 本文是篇几乎没有证明的佛系讲解 单位根反演的式子长这样: 1n∑i=0n−1ωnik=[k∣n]\frac{1}{n}\sum_{i=0}^{n-1} ...

  5. [学习笔记] 单位根反演

    单位根反演 [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 次 ...

  6. UOJ#450. 【集训队作业2018】复读机 排列组合 生成函数 单位根反演

    原文链接https://www.cnblogs.com/zhouzhendong/p/UOJ450.html 题解 首先有一个东西叫做"单位根反演",它在 FFT 的时候用到过: ...

  7. 【学习笔记】斯特林反演+单位根反演

    upd:抄了一下 ppt \text{ppt} ppt. 1.1 1.1 1.1 斯特林反演 有两个恒等式: [ i = j ] = ∑ ( − 1 ) i − k [ i k ] { k j } [ ...

  8. 矩阵快速幂+构造方法

    与快速幂一样,可以将递推式通过二进制的方式来进行优化,这个学了快速幂就是十分容易理解 大概的板子如下: struct mat///自己定义大小的矩阵 {ll m[11][11]; }; mat mul ...

  9. 【做题】SRM701 Div1 Hard - FibonacciStringSum——数学和式&矩阵快速幂

    原文链接 https://www.cnblogs.com/cly-none/p/SRM701Div1C.html 题意:定义"Fibonacci string"为没有连续1的01串 ...

最新文章

  1. 淘淘经受了一次考验...
  2. 获取input数据_使用 PHP Masked Package 屏蔽敏感数据
  3. 后台返回给前端json字段的大小写问题,Lombok的坑
  4. loadrunner-3-1创建测试场景
  5. Linux进程管理:内核中的优先级继承互斥(rtmutex.h):防止优先级反转
  6. php多次登录失败,PHPCMS登录后台失败次数过多解决办法
  7. 相关滤波的视觉目标跟踪算法学习
  8. linux增加分区大小,新增硬盘扩容Linux下的分区大小
  9. 宿主机如何和虚拟机WinServer2008的网络互通
  10. 为前端工作者准备的几个炫彩的js动画库
  11. 发动机和变速箱工作原理
  12. python求组合数c(m、n)编程题_c语言编程问题,计算出从n 个不同元素中取出m 个元素(m≤n)的组合数。编写程序...
  13. 黑苹果13.0.1驱动RTL 8125B 2.5G网卡失败故障排查
  14. php制作个人简介代码_PHP制作用户注册系统的详细代码
  15. iphone热点蓝条闪烁
  16. Excel中利用vba将多个sheet合并在一个sheet中的方法
  17. TCP/IP 基本C/S模型
  18. 2023 年腾讯云服务器租用价格表出炉(CPU、内存、带宽、系统盘)
  19. 【navicat 密码查看】小技巧navicat 如何查看密码
  20. Spring容器的启动流程

热门文章

  1. linux什么用户什么任务,Linux 用户
  2. Anaconda详细安装及安装Scrapy框架
  3. img=img%3e128 matlab,Matlab中一般的数值计算和使用
  4. 收集一些非常实用的Linux命令
  5. Git rebase 和 Git merge 的区别,你知道吗?
  6. linux 本地yum 恢复,Linux_RHEL系统恢复安装光盘中的yum更新源的方法,安装光盘本地YUM更新源挂载安 - phpStudy...
  7. 提现接口网站 php,API提现接口
  8. 带wiringPi库的交叉编译
  9. 成年人的样子是什么样子_不只是看样子
  10. 同态加密应用_重新设计具有同态性的银行应用