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取 ...
随机推荐
- JavaWeb之Servlet中ServletConfig和ServletContext
[声明] 欢迎转载,但请保留文章原始出处→_→ 文章来源:http://www.cnblogs.com/smyhvae/p/4140877.html [正文] 一.ServletConfig:代表当前 ...
- 原生Js弹窗插件|web弹出层组件|对话框
wcPop.js 是一款基于原生javascript开发的前端 web版 弹窗组件,遵循原生 H5/css3/JS 的书写规范,简单实用.拿来即用(压缩后仅10KB).已经兼容各大主流浏览器.内含多种 ...
- Java之集合(二十)LinkedBlockingQueue
转载请注明源出处:http://www.cnblogs.com/lighten/p/7503678.html 1.前言 本章介绍阻塞队列LinkedBlockingQueue,这是一个基于链表的可选长 ...
- python获取动态网站上面的动态加载的数据(selenium+Firefox)
最近突然想到以前爬取百度学术上的参考文献,大家可以看一下以前我的写的博客:http://www.cnblogs.com/ybf-yyj/p/7351493.html,但是如果利用这个方法,太痛苦了,需 ...
- eclipse 首次使用配置
这里是eclipse neo版本的配置 1.设置workspace 首次启动,选择指定的工作空间(workspace),用于存放java代码.
- 【C#小知识】C#中一些易混淆概念总结(五)---------继承 分类: C# 2014-02-06 22:05 1106人阅读 评论(0) 收藏
目录: [C#小知识]C#中一些易混淆概念总结--------数据类型存储位置,方法调用,out和ref参数的使用 [C#小知识]C#中一些易混淆概念总结(二)--------构造函数,this关键字 ...
- Tomcat 基本配置
1.配置虚拟目录映射 推荐在 /conf/Catalina/localhost 下新建rand.xml方式建立虚拟目录 其中rand将会被当作映射对象,即外部访问路径. 例子:blog.xml < ...
- 【链表】Swap Nodes in Pairs(三指针)
题目: Given a linked list, swap every two adjacent nodes and return its head. For example,Given 1-> ...
- Android 开发工具类 04_KeyBoardUtils
打开或关闭软键盘: 1.打卡软键盘: 2.关闭软键盘. import android.content.Context; import android.view.inputmethod.InputMet ...
- PL/SQL程序设计
1 PL/SQL简介 1 什么是PL/SQL? PL/SQL是 Procedure Language & Structured Query Language 的缩写.PL/SQL是对SQL语言 ...