[数论][二项式定理][矩阵乘法] BZOJ 3328: PYXFIB
来源:互联网 发布:拼豆转图软件手机 编辑:程序博客网 时间:2024/05/01 23:55
Description
求
Solution
设
剩下的东西矩阵快速幂搞一搞就好啦。
#include <bits/stdc++.h>using namespace std;const int N = 202020;typedef long long ll;int test;ll n;int k, P, g, w, Iw, Ppcnt, Ik;struct Matrix { int a[3][3]; Matrix(void) { } inline int *operator [](int x) { return a[x]; } inline friend Matrix operator *(Matrix a, Matrix b) { Matrix res; for (int i = 1; i <= 2; i++) for (int j = 1; j <= 2; j++) { res[i][j] = 0; for (int k = 1; k <= 2; k++) { res[i][j] += (ll)a[i][k] * b[k][j] % P; while (res[i][j] >= P) res[i][j] -= P; } } return res; } inline friend Matrix operator *(int a, Matrix b) { for (int i = 1; i <= 2; i++) for (int j = 1; j <= 2; j++) b[i][j] = (ll)b[i][j] * a % P; return b; } inline friend Matrix operator *(Matrix a, int b) { return b * a; } inline friend Matrix operator +(Matrix a, Matrix b) { for (int i = 1; i <= 2; i++) for (int j = 1; j <= 2; j++) { a[i][j] += b[i][j]; while (a[i][j] >= P) a[i][j] -= P; } return a; }};Matrix I, A, Ans, O;int pp[N];inline void Add(int &x, int a) { x += a; while (x >= P) x -= P;}inline int Pow(int a, ll b) { int c = 1; while (b) { if (b & 1) c = (ll)c * a % P; b >>= 1; a = (ll)a * a % P; } return c;}inline int Inv(int x) { return Pow(x, P - 2);}inline Matrix Pow(Matrix a, ll b) { Matrix c = I; while (b) { if (b & 1) c = c * a; b >>= 1; a = a * a; } return c;}inline int PRoot(int P) { if (P == 3) return 2; int phi = P - 1; double m = sqrt(phi); Ppcnt = 0; for (int i = 2; i <= m; i++) if (phi % i == 0) { pp[++Ppcnt] = i; if (phi / i > i) pp[++Ppcnt] = phi / i; } for (int g = 2; ; g++) { for (int i = 1; i <= Ppcnt; i++) if (Pow(g, pp[i]) == 1) break; else if (i == Ppcnt) return g; }}inline Matrix F(int x) { return Pow(Inv(x), n) * Pow(x * I + A, n);}int main(void) { freopen("1.in", "r", stdin); scanf("%d", &test); I[1][1] = I[2][2] = 1; A[1][1] = A[1][2] = A[2][1] = 1; while (test--) { scanf("%lld%d%d", &n, &k, &P); Ans = O; g = PRoot(P); w = Pow(g, (P - 1) / k); Iw = Inv(w); for (int i = 0; i < k; i++) Ans = Ans + F(Pow(Iw, i)); Ans = Ans * Inv(k); printf("%d\n", Ans[1][1]); } return 0;}
阅读全文
2 0
- [数论][二项式定理][矩阵乘法] BZOJ 3328: PYXFIB
- bzoj 3328: PYXFIB 数论&矩阵乘法
- [矩阵 二项式定理 单位根 构造 数学神题] BZOJ 3328 PYXFIB
- BZOJ 3328: PYXFIB 二项式定理 原根 构造
- 【BZOJ 3328】PYXFIB
- BZOJ 3240: [Noi2013]矩阵游戏 矩阵乘法 费马小定理
- bzoj 2432: [Noi2011]兔农 (数论+矩阵乘法)
- OpenJudge 1058 Guideposts | BZOJ 3328 PYXFIB
- hdu 3483 矩阵快速幂+二项式定理
- 【BZOJ 2738】 矩阵乘法
- [BZOJ 2738]矩阵乘法
- BZOJ 1297 矩阵乘法
- BZOJ 2738: 矩阵乘法
- BZOJ 2738: 矩阵乘法
- bzoj 2738 矩阵乘法
- 快速幂+乘法逆元+二项式定理(hdu 5793)
- 二项式定理
- 二项式定理
- Scrapy学习笔记(2)
- <jsp:include>和<%@include%>的区别
- git同步服务端
- hadoop集群安装、常见问题解决
- 超声波测距仪
- [数论][二项式定理][矩阵乘法] BZOJ 3328: PYXFIB
- 单链表逆序问题
- fedora服务器网站搭建
- 象形识字隐私用户数据声明
- 自由幻想UI之宠物界面
- 理解字节序
- bzoj 1019: [SHOI2008]汉诺塔(打表)
- bzoj 1036: [ZJOI2008]树的统计Count(树链剖分)
- top和ps取长补短续篇3之进程定位