传送门

题意:

∑i=0⌊nk⌋(nik)Fik\sum_{i=0}^{\lfloor\frac nk\rfloor}\binom n{ik}F_{ik}i=0∑⌊kn​⌋​(ikn​)Fik​

FFF为斐波拉契数列

n≤1e18,k≤2e4,p≤1e9n\leq 1e18,k\leq2e4,p\leq1e9n≤1e18,k≤2e4,p≤1e9且为质数且模kkk余111


显然就是求

∑i=0n[k∣i](ni)Fi\sum_{i=0}^n[k\mid i]\binom niF_ii=0∑n​[k∣i](in​)Fi​

显然FFF可以通过矩阵表示出来

A=(1110),S=(10)A=\left(\begin{matrix}1&1\\1&0\end{matrix}\right),S=\left(\begin{matrix}1\\0\end{matrix}\right)A=(11​10​),S=(10​)

那么只需要求出

∑i=0n[k∣i](ni)AiS\sum_{i=0}^n[k\mid i]\binom niA^iSi=0∑n​[k∣i](in​)AiS

相当于求

∑i=0n[k∣i](ni)Ai\sum_{i=0}^n[k\mid i]\binom niA^ii=0∑n​[k∣i](in​)Ai

然后日常把这个幻视成二项式定理害得我调了两个小时

显然可以单位根反演

1k∑j=0k−1∑i=0n(ni)Aiωij\frac 1k\sum_{j=0}^{k-1}\sum_{i=0}^n\binom niA^i\omega^{ij}k1​j=0∑k−1​i=0∑n​(in​)Aiωij

=1k∑j=0k−1∑i=0n(ni)(Aωj)i=\frac 1k\sum_{j=0}^{k-1}\sum_{i=0}^n\binom ni(A\omega^j)^i=k1​j=0∑k−1​i=0∑n​(in​)(Aωj)i

二项式定理走一波

=1k∑j=0k−1(Aωj+I)n=\frac 1k\sum_{j=0}^{k-1}(A\omega^j+I)^n=k1​j=0∑k−1​(Aωj+I)n

然后就可以算了

因为p%k=1p\%k=1p%k=1,所以可以找一个原根算出ω\omegaω

复杂度O(klog⁡n)O(k\log n)O(klogn)

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cctype>
using namespace std;
typedef long long ll;
ll n;
int k,MOD;
inline int add(const int& x,const int& y){return x+y>=MOD? x+y-MOD:x+y;}
inline int dec(const int& x,const int& y){return x<y? x-y+MOD:x-y;}
inline int qpow(int a,int b)
{int ans=1;while (b){if (b&1) ans=(ll)ans*a%MOD;a=(ll)a*a%MOD;b>>=1;}return ans;
}
int g,Wn;
inline bool check(int x)
{int n=x;for (int i=2;i*i<=x;i++)if (x%i==0){if (qpow(g,n/i)==1) return false;while (x%i==0) x/=i;}if (x>1&&qpow(g,n/x)==1) return false;return true;
}
struct mat
{int e[2][2];mat(const int& x=0){e[0][0]=e[1][1]=x;e[0][1]=e[1][0]=0;}int* operator [](int i){return e[i];}
};
inline int det(mat m){return dec((ll)m[0][0]*m[1][1]%MOD,(ll)m[0][1]*m[1][0]%MOD);}
inline mat operator *(mat a,mat b)
{mat ans;ans[0][0]=add((ll)a[0][0]*b[0][0]%MOD,(ll)a[0][1]*b[1][0]%MOD);ans[0][1]=add((ll)a[0][0]*b[0][1]%MOD,(ll)a[0][1]*b[1][1]%MOD);ans[1][0]=add((ll)a[1][0]*b[0][0]%MOD,(ll)a[1][1]*b[1][0]%MOD);ans[1][1]=add((ll)a[1][0]*b[0][1]%MOD,(ll)a[1][1]*b[1][1]%MOD);   return ans;
}
inline mat operator +(mat a,mat b)
{mat ans;ans[0][0]=add(a[0][0],b[0][0]);ans[0][1]=add(a[0][1],b[0][1]);ans[1][0]=add(a[1][0],b[1][0]);ans[1][1]=add(a[1][1],b[1][1]);   return ans;
}
inline mat operator *(mat a,const int& t)
{mat ans;ans[0][0]=(ll)a[0][0]*t%MOD;ans[0][1]=(ll)a[0][1]*t%MOD;ans[1][0]=(ll)a[1][0]*t%MOD;ans[1][1]=(ll)a[1][1]*t%MOD;   return ans;
}
inline mat qpow(mat a,ll p)
{mat ans(1);while (p){if (p&1) ans=ans*a;a=a*a;p>>=1;}return ans;
}
int main()
{int T;scanf("%d",&T);while (T--){scanf("%lld%d%d",&n,&k,&MOD);for(g=2;!check(MOD-1);g++);Wn=qpow(g,(MOD-1)/k);mat T,sum;T[0][0]=T[0][1]=T[1][0]=1;T[1][1]=0;for (int i=0;i<k;i++,T=T*Wn) sum=sum+qpow(T+mat(1),n);sum=sum*qpow(k,MOD-2);printf("%d\n",sum[0][0]);}return 0;
}

【BZOJ3328】PYXFIB【矩阵快速幂】【单位根反演】【二项式定理】相关推荐

  1. (详解)矩阵快速幂详解与常见转移矩阵的构造

    目录 转移矩阵求解套路 常见转移矩阵1-斐波那契矩阵 承接套路 常见转移矩阵2-类斐波那契数列 常见转移矩阵3-幂常数 前缀和 具体DP问题 ----------------------------- ...

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

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

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

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

  4. 快速幂 + 矩阵快速幂

    快速幂 1 #include<iostream> 2 #include<algorithm> 3 #include<cstring> 4 #define LL lo ...

  5. HDU4549(矩阵快速幂+快速幂)

    f(n)=a^f(n-1) + b^f(n-2):计算矩阵部分用矩阵快速幂:计算a的幂次和b的幂次用快速幂. #include<iostream> #include<algorith ...

  6. [HNOI2008]GT考试[矩阵快速幂+kmp优化的dp]

    解题思路:假如说我们用f[i]表示长度为i的串能组合成无不吉利数字的组合的个数的话我们无法找到f[i]和f[i+1]的关系,就是我们下一位填某个数字会不会出现不吉利串,这就和你前面的串末尾于不吉利串重 ...

  7. I-Matrix Power Series POJ - 3233 矩阵快速幂+分治

    I-Matrix Power Series POJ - 3233 矩阵快速幂+分治 Problem Description Given a n × n matrix A and a positive ...

  8. H - Fibonacci POJ - 3070 (矩阵快速幂)

    H - Fibonacci POJ - 3070 (矩阵快速幂) Description In the Fibonacci integer sequence, F0 = 0, F1 = 1, and ...

  9. HDU 6185 Covering 矩阵快速幂 递推

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=6185 题目描述: 一个4*n的矩形, 你用1*2的矩形覆盖有多少种方案, n <= 1e18 ...

  10. bzoj 1409 Password 矩阵快速幂+欧拉函数

    可以发现,该数组的mi就是斐波那契数列 所以要矩阵快速幂搞出第n位 但是斐波那契数列上涨的很快,这就需要欧拉定理了 p^phi(q)%q=1(gcd(p,q)==1) p是素数,所以可以用 然后需要5 ...

最新文章

  1. 使用Visual Studio将Objective-C编译C++
  2. 【编程4】插入排序+快速排序+LeetCode.148(排序链表)
  3. UnicodeDecodeError: 'ascii' codec can't decode byte 0x82 in position 4..... 针对调用文件出现该错误时的解决办法
  4. c语言回溯算法骑士周游,191-骑士周游回溯算法代码实现(1)
  5. php serialize error at offset,PHP Notice: unserialize(): Error at offset XX of XX bytes
  6. 线性回归用matlab怎么做,matlab中如何应用regress()函数进行线性回归分析?
  7. 95-40-060-java.util.concurrent-ConcurrentSkipListMap
  8. navicat为什么收费,用的人还是不少
  9. 腾讯云刘颖:与微信共建小程序开发者生态,让小程序开发更简单
  10. paip.提升用户体验---免维护列表字段
  11. ros中odometry数据生成方式与分发去向
  12. org.apache.felix.http.jetty %bundles.pluginTitle: Cannot start (org.osgi.framework.BundleException:
  13. 巴比特 | 元宇宙每日必读:蒂芙尼宣布推出限量版 CryptoPunk 定制吊坠
  14. java计算机毕业设计Vue垃圾分类指南平台设计与实现源码+数据库+系统+lw文档
  15. 算法设计与分析: 5-22 魔方(Rubik's Cube)问题
  16. 双因素方差检验(Two factor variance test)
  17. 应用楼宇自控系统降低建筑物设备成本
  18. leaflet加载OSM地图
  19. Arduino制作俄罗斯方块小游戏(三)程序源码
  20. 第五章 CSS美化网页元素

热门文章

  1. python基础ppt_Python基础课件.ppt
  2. 不同对象的通话是时长​
  3. 叫板BBC!80后湖南姑娘,花3年首次拍出水下的中国,惊艳了全世界
  4. 【物理动图】物理老师一针见血:50张动图看懂高中物理
  5. python每天定时9点执行_python 定时器每天就执行一次的实现代码
  6. php curl hostname,php – 如何解决cURL错误(7):无法连接到主机?
  7. ORACLE数据加载加本,使用oracle sqlldr加载数据
  8. python bind sock_python SOCKET编程详细介绍
  9. python爬取论坛付费内容_Python爬虫抓取论坛关键字过程解析
  10. python 日期格式校验_python – 如何验证时间格式?