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

对于一个矩阵\(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;
}

CF696C PLEASE的更多相关文章

  1. CF697E && CF696C PLEASE

    题意:给你三个杯子,一开始钥匙放在中间的杯子里,然后每一回合等概率将左右两个杯子中的一个与中间杯子交换.求n回合之后钥匙在中间杯子的概率.这里要求概率以分数形式输出,先化成最简,然后对1e9 + 7取 ...

随机推荐

  1. 设置User Agent

    公司的前端要给项目的webview加一个区分,用来区别是iOS端访问.android访问还是在浏览器访问的,说是要加一个User Agent ,前端根据不同信息做适配,和我说来一头雾水,后来经过开发同 ...

  2. 对CAS机制的理解(一)

    先看一段代码:启动两个线程,每个线程中让静态变量count循环累加100次. public class CountTest { public static int count = 0; public ...

  3. Apache JMeter2.13 实战

    安装目录下 设置浏览器代理127.0.0.1 8080,以chrome为例 开始录制脚本,进入应用点击相应的功能,可以捕获到如下地址 去除无用地址,保留需要测试的地址 注:上图编号列表中11为获取co ...

  4. 搭建互联网架构学习--006--duboo准备之zk集群部署安装

    dubbo集群部署安装依赖于zookeeper,所以先安装zookeeper集群. 1.准备三台机器做集群 2.配置 配置java环境  ,2,修改操作系统的/etc/hosts文件,添加IP与主机名 ...

  5. 【链表】Insertion Sort List

    题目: Sort a linked list using insertion sort. 思路: 插入排序是一种O(n^2)复杂度的算法,基本想法相信大家都比较了解,就是每次循环找到一个元素在当前排好 ...

  6. 关于 IOC和spring基本配置详解

    Spring 中的两个概念 IOC控制反转(也叫依赖注入DI): AOP面向切面编程: 控制反转:当某个java对象需要(依赖)另一个java对象是,不是直接创建依赖对象,而是由实现IOC的容器来创建 ...

  7. 9.png图片制作详细教程

    1.背景自适应且不失真问题的存在      制作自适应背景图片是UI开发的一个广泛问题,也是界面设计师渴望解决的问题,我相信我们彼此都深有体会.      比如,列表的背景图一定,但是列表的高度随着列 ...

  8. C#中null值属于什么变量类型

    今天学习发现有段代码的输出结果有些理解不了,如图1,输出的结果全部为 false: 图1 后来和同事讨论研究了一下才明白,原来是这样:↓ class Program { static void Mai ...

  9. Centos调整时间时区

    一台VPS的时间出错,使用常规手段修改均失败.提示hwclock failed : ntpdate stdtime.sinica.edu.tw 如果你的 VPS 提示没有 ntpdate 这个命令,可 ...

  10. 一步步用svg做一个声波扩散动画

    有个项目需要在某个坐标显示一个声波扩散(不知道这个表达对不对)的动画. 这种需求一般做法有几种,一种做成gif图片,然后贴上去,一种是用html+css3完成,要么就是画上去,这画又分两种,一种是Ca ...