CF696C PLEASE
矩阵快速幂+扩展欧拉定理
对于一个矩阵\(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^{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的更多相关文章
- CF697E && CF696C PLEASE
题意:给你三个杯子,一开始钥匙放在中间的杯子里,然后每一回合等概率将左右两个杯子中的一个与中间杯子交换.求n回合之后钥匙在中间杯子的概率.这里要求概率以分数形式输出,先化成最简,然后对1e9 + 7取 ...
随机推荐
- jQuery.extend 函数
jQuery.extend 函数详解 JQuery的extend扩展方法: Jquery的扩展方法extend是我们在写插件的过程中常用的方法,该方法有一些重载原型,在此,我们一起去了解了解. 一.J ...
- Swift 里字符串(四)large sting
对于普通的字符串,对应的_StringObject 有两个存储属性: _countAndFlagsBits: UInt64 _object: Builtin.BridgeObject _countAn ...
- 如何正确的加载和执行 JavaScript 代码
无论当前 JavaScript 代码是内嵌还是在外链文件中,页面的下载和渲染都必须停下来等待脚本执行完成.JavaScript 执行过程耗时越久,浏览器等待响应用户输入的时间就越长.浏览器在下载和执行 ...
- Java之集合(三)ArrayList
转载请注明源出处:http://www.cnblogs.com/lighten/p/7291339.html 1.前言 本章介绍List中最常用的一个类--ArrayList.在第一章中已经介绍了Li ...
- EF基础知识小记七(拆分实体到多个表以及拆分表到多个实体)
一.拆分实体到多个表 1.在日常开发中,会经常碰到一些老系统,当客户提出一些新的需求,这些需求需要在原来的表的基础上加一些字段,大多数人会选择通过给原表添加字段的方式来完成这些需求,方法,虽然可行,但 ...
- CS231n学习笔记-图像分类笔记(下篇)
原文地址:智能单元 K-Nearest Neighbor分类器 大家可能注意到了,为什么只用最相似的一张图片的标签来作为测试图像的标签呢?这不是很奇怪吗!是的,使用K-Nearest Neighbor ...
- 最小化或关闭Outlook2013到系统托盘
https://community.spiceworks.com/how_to/36214-minimize-and-or-close-outlook-to-taskbar 要注意里面提到的以管理员权 ...
- jquery插件开发的demo
(function ($) { $.fn.extend({ "highLight": function (options) { //检测用户传进来的参数是否合法 if (!isVa ...
- 自定义针对Product Key处理的TextBox
代码: using System; using System.Collections.Generic; using System.Linq; using System.Text; using Syst ...
- WPF样式动画Trigger.EnterActions和Trigger.ExitActions(ExitActions其实可以不做任何事情)
这是一个鼠标移入后,控件往左移动的动画: <Style TargetType="{x:Type StackPanel}"> <Setter Property=&q ...