博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
CF696C PLEASE
阅读量:6250 次
发布时间:2019-06-22

本文共 1790 字,大约阅读时间需要 5 分钟。

矩阵快速幂+扩展欧拉定理

对于一个矩阵\(A\),我们有\(A^n \equiv A^{n\% \phi(m)+\phi(m)}(\%m)\)

经过简单的列举或推导可得

设目前进行了\(x\)轮,\(f(x)\)为分子,\(g(x)\)为分母

则有\(f(x)=g(x-1)-f(x-1),g(x)=2g(x-1)\)

由此及首项可得\(x>1\)时概率的分子一直是奇数,分母一直为2的幂

\(x=1\)时分子为0,分母为1

即分子与分母恒互质

由此可得转移矩阵

\[A=\begin{bmatrix} -1 & 1 \\ 0 & 2 \end{bmatrix}\]

初始矩阵

\[B=\begin{bmatrix} 0 \\ 1 \end{bmatrix}\]

\(A^{n-1} \times B=\begin{bmatrix} p \\ q \end{bmatrix}\)

p/q为所求

该算法时间复杂度为\(\Theta(k)\),是本题的理论时间复杂度下限。

#include"cstdio"#include"cstring"#include"iostream"#include"algorithm"using namespace std;const int MOD=1e9+7;const int siz=5;int n;long long v=1;struct Matrix{    long long v[siz][siz];    int x,y;    void clear(){memset(v,0,sizeof(v));x=y=0;}    void Mmul(Matrix a,Matrix b)    {        clear();        x=a.x,y=b.y;int c=a.y;        for(int i=1;i<=x;++i){            for(int j=1;j<=y;++j){                for(int k=1;k<=c;++k){                    v[i][j]+=a.v[i][k]*b.v[k][j]%MOD;                    v[i][j]=(v[i][j]%MOD+MOD)%MOD;                }            }        }return;    }    Matrix Mpw(Matrix a,long long b)    {        Matrix x;x.clear();x.x=x.y=a.x;        for(int i=1;i<=a.x;++i) x.v[i][i]=1;        while(b){            if(b&1) x.Mmul(x,a);            b>>=1;a.Mmul(a,a);        }return x;    }        void write()    {        for(int i=1;i<=x;++i){            for(int j=1;j<=y;++j){                printf("%lld ",v[i][j]);            }puts("");        }puts("");        return;    }}A,B;int main(){    scanf("%d",&n);    for(int i=1;i<=n;++i){long long x;scanf("%lld",&x);v=(x%(MOD-1)*v)%(MOD-1);}    v+=MOD-1;    A.x=A.y=2;B.x=2,B.y=1;    A.v[1][1]=-1,A.v[1][2]=1,A.v[2][2]=2;    B.v[2][1]=1;    A=A.Mpw(A,v-1);B.Mmul(A,B);    printf("%lld/%lld\n",B.v[1][1],B.v[2][1]);    return 0;}

转载于:https://www.cnblogs.com/AH2002/p/10105481.html

你可能感兴趣的文章
java反射--动态加载
查看>>
Java下String逗号数组和List<String>的互相转换
查看>>
Eonasdan bootstrap datetimepicker 使用记录
查看>>
win7 64位系统下读写access数据库以及安装了office32位软件再安装64位odbc的方法
查看>>
网络最大流算法—Dinic算法及优化
查看>>
linux中iptables的用法
查看>>
MongoDB的简单操作
查看>>
C# 合并Excel工作表
查看>>
《机器学习实战》2.2.2分析数据:使用matplotlib创建散点图
查看>>
Linux如何查看当前占用CPU或内存最多的几个进程
查看>>
bit,byte,char,位,字节,字符 的区别
查看>>
Docker 容器入门
查看>>
[LeetCode] Pyramid Transition Matrix 金字塔转变矩阵
查看>>
几种查看CentOS系统版本号和位数的方法
查看>>
数字签名到底是什么鬼?
查看>>
GoldenGate实时投递数据到大数据平台(7)– Apache Hbase
查看>>
python安装h5py
查看>>
异常处理器
查看>>
生命的活力-负熵-秩序-结构
查看>>
[LeetCode] Number of Distinct Islands II 不同岛屿的个数之二
查看>>