题目分析:

这题的目标是求$$ \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 $

推理过程略,实际上也就是交换求和符号的事情。

接着就变成裸的矩阵快速幂了

代码:

 #include<bits/stdc++.h>
using namespace std; int m,k,p;long long n;
int l,s,t,gg; struct mat{int arr[][];}G,bs,mmp;
vector<int> fac; // factor of p void buildbase(int w){
for(int i=;i<=m;i++)
for(int j=;j<=m;j++) bs.arr[i][j] = 1ll*w*G.arr[i][j]%p;
for(int i=;i<=m;i++) bs.arr[i][i] ++,bs.arr[i][i] %= p;
} mat operator*(mat alpha,mat beta){
memset(mmp.arr,,sizeof(mmp.arr));
for(int k=;k<=m;k++){
for(int i=;i<=m;i++){
for(int j=;j<=m;j++){
mmp.arr[i][j] += 1ll*alpha.arr[i][k]*beta.arr[k][j]%p;
mmp.arr[i][j] %= p;
}
}
}
return mmp;
} mat res;
mat fstpow(mat now,long long pw){
memset(res.arr,,sizeof(res.arr));
for(int i=;i<=m;i++) res.arr[i][i] = ;
long long bit = ;
while(bit <= pw){
if(bit & pw){res = res*bs;}
bs = bs*bs;bit<<=;
}
return res;
} void init(){
memset(G.arr,,sizeof(G.arr));
fac.clear();
l = s = t = gg = ;
} void read(){
scanf("%d%d%d",&l,&s,&t);
for(int i=;i<=l;i++){
int u,v; scanf("%d%d",&u,&v);
G.arr[u][v]++;
}
} int fast_pow(int now,int pw){
int ans = ,dt = now,bit = ;
while(bit <= pw){
if(bit & pw){ans = 1ll*ans*dt%p;}
dt = 1ll*dt*dt%p; bit<<=;
}
return ans;
} void getgg(){
int z = p-;
for(int i=;i*i<=z;i++){
if(z % i == ){
fac.push_back(i);
while(z % i == ) z /= i;
}
}
if(z != ) fac.push_back(z);
for(int i=;i<=p;i++){
int flag = true;
for(int j=;j<fac.size();j++){
int z = fast_pow(i,(p-)/fac[j]);
if(z == ){flag = false; break;}
}
if(flag){gg = i;break;}
}
gg = fast_pow(gg,(p-)/k);
} void work(){
int w = ,ans = ;
for(int i=;i<k;i++,w = 1ll*w*gg%p){
buildbase(w);
bs = fstpow(bs,n);
ans += bs.arr[s][t]; ans%=p;
}
ans = 1ll*ans*fast_pow(k,p-)%p;
printf("%d\n",ans);
} int main(){
while(scanf("%d%lld%d%d",&m,&n,&k,&p) == ){
init();
read();
getgg();
work();
}
return ;
}

POJChallengeRound2 Guideposts 【单位根反演】【快速幂】的更多相关文章

  1. 【BZOJ3328】PYXFIB(单位根反演,矩阵快速幂)

    [BZOJ3328]PYXFIB(单位根反演,矩阵快速幂) 题面 BZOJ 题解 首先要求的式子是:\(\displaystyle \sum_{i=0}^n [k|i]{n\choose i}f_i\ ...

  2. bzoj3328: PYXFIB(单位根反演+矩阵快速幂)

    题面 传送门 题解 我们设\(A=\begin{bmatrix}1 & 1 \\ 1 & 0\end{bmatrix}\),那么\(A^n\)的左上角就是\(F\)的第\(n\)项 所 ...

  3. 2019.2.25考试T1, 矩阵快速幂加速递推+单位根反演(容斥)

    \(\color{#0066ff}{题解}\) 然后a,b,c通过矩阵加速即可 为什么1出现偶数次3没出现的贡献是上面画绿线的部分呢? 考虑暴力统计这部分贡献,答案为\(\begin{aligned} ...

  4. 【bzoj3684】 大朋友和多叉树 生成函数+多项式快速幂+拉格朗日反演

    这题一看就觉得是生成函数的题... 我们不妨去推下此题的生成函数,设生成函数为$F(x)$,则$[x^s]F(x)$即为答案. 根据题意,我们得到 $F(x)=x+\sum_{i∈D} F^i(x)$ ...

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

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

  6. BZOJ3561 DZY Loves Math VI 数论 快速幂 莫比乌斯反演

    原文链接http://www.cnblogs.com/zhouzhendong/p/8116330.html UPD(2018-03-26):回来重新学数论啦.之前的博客版面放在更新之后的后面. 题目 ...

  7. BZOJ3328 PYXFIB 单位根反演

    题意:求 \[ \sum_{i=0}^n[k|i]\binom{n}{i}Fib(i) \] 斐波那契数列有简单的矩阵上的通项公式\(Fib(n)=A^n_{1,1}\).代入得 \[ =\sum_{ ...

  8. 数学杂烩总结(多项式/形式幂级数+FWT+特征多项式+生成函数+斯特林数+二次剩余+单位根反演+置换群)

    数学杂烩总结(多项式/形式幂级数+FWT+特征多项式+生成函数+斯特林数+二次剩余+单位根反演+置换群) 因为不会做目录所以请善用ctrl+F 本来想的是笔记之类的,写着写着就变成了资源整理 一些有的 ...

  9. loj#6485. LJJ 学二项式定理(单位根反演)

    题面 传送门 题解 首先你要知道一个叫做单位根反演的东西 \[{1\over k}\sum_{i=0}^{k-1}\omega^{in}_k=[k|n]\] 直接用等比数列求和就可以证明了 而且在模\ ...

随机推荐

  1. AI时代大点兵-国内外知名AI公司2018年最新盘点

    AI时代大点兵-国内外知名AI公司2018年最新盘点 导言 据腾讯研究院统计,截至2017年6月,全球人工智能初创企业共计2617家.美国占据1078家居首,中国以592家企业排名第二,其后分别是英国 ...

  2. 43.Odoo产品分析 (四) – 工具板块(11) – 网站即时聊天(1)

    查看Odoo产品分析系列--目录 在线聊天可以实现与顾客的在线实时交流,比如在"商店"功能中实现顾客对客服的商品咨询等类似的操作.  安装"网站即时聊天"模块: ...

  3. 章节十、1-用ID和XPath、name定位元素

    一.在定位元素时需要HTML标签,HTML是超文本标记语言,我们打开web网页是看到的内容就是通过html语言来实现的,按键盘“F12”调用开发者选项后,“Elements”栏中显示的就是网页的HTM ...

  4. 测者的性能测试手册:Yourkit 监控JettyYourkit 监控Jetty

    Yourkit是收费工具,每一个email可以免费试用15天,觉得好的朋友可以自行选择购买 服务器端下载yourkit(java) Windows安装yourkit Java Profiler 201 ...

  5. Python第七天 函数 函数参数 函数里的变量 函数返回值 多类型传值 函数递归调用 匿名函数 内置函数

    Python第七天   函数  函数参数   函数里的变量   函数返回值  多类型传值     函数递归调用   匿名函数   内置函数 目录 Pycharm使用技巧(转载) Python第一天   ...

  6. c/c++ 网络编程 UDP up/down 网卡

    网络编程 UDP up/down 网卡 在程序里动态改变网卡的状态.注意:程序运行需要root权限. 程序运行的方法: sudo ./a.out 1,关闭网卡 #include <stdio.h ...

  7. C 存储类

    存储类定义 C 程序中变量/函数的范围(可见性)和生命周期.这些说明符放置在它们所修饰的类型之前.下面列出 C 程序中可用的存储类: auto.register.static.extern auto ...

  8. Lua中string.format占位符的使用

    虽然lua中字符串拼接"string.format"相对于".."消耗较大,但有时为了代码的可读性,项目中还是经常用到"string.format&q ...

  9. git add 添加多个文件

    在使用git add提交多个文件的方式: git add .   后面加一个".",匹配所有的文件 总结下,提交多个文件时,git add后可以有如下参数以及参数的解释: git ...

  10. 聚类——GMM

    聚类——认识GMM算法 作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 一.GMM概述 二.GMM算法步骤 三.具体推导参考文献 1. 李航. 统计学习 ...