bzoj4490 随机数生成器Ⅱ加强版
题意
给出参数\(C_1,C_2,P\)按如下方式生成一个长度为\(n \times m\)的序列\(x\):
\(x_0 = C_1,x_1=C2\)
\(x_i=(x_{i-1}+x_{i-1}) \% P \; (i > 1)\)
然后按如下方式生成一个长度为\(n \times m\)的序列\(a\)
\]
然后现在进行\(Q\)次操作,每次操作给出两个参数\(k1,k2\)。表示交换\(k1,k2\)的值。
然后把序列\(a\)按顺序放到一个\(n \times m\)的网格中。
要求出一种方案,使得从\((1,1)\)走到\((n,m)\),所经过的数字排列起来字典序最小。
思路
容易发现,其实就是快速求出\(a_i\)。
然后就推一下式子。
\]
\]
\]
\]
\]
\]
也就是说
\]
这样也就是容易得到
\]
所以只要可以快速的求出斐波那契数列第\(i\)项就可以了。
如果直接每次矩阵快速幂会\(TLE\)
所以先预处理出\(fbi_1,fbi_2,fbi_3...fbi_m\)和\(fbi_m,fbi_{2m},fbi_{3m}...fbi{nm}\)的转移矩阵。
对于第\(i\)行第\(j\)列的数,直接\(O(2^3)\)求出
代码
#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<cmath>
#include<ctime>
#include<algorithm>
#include<cstring>
#include<bitset>
#include<map>
using namespace std;
typedef long long ll;
const int N = 500000 + 100,INF = 1e9 + 7;
map<ll,ll>ma;
ll read() {
ll x=0,f=1;char c=getchar();
while(c<'0'||c>'9') {
if(c=='-') f=-1;
c=getchar();
}
while(c>='0'&&c<='9') {
x=x*10+c-'0';
c=getchar();
}
return x*f;
}
int C1,C2,mod,n,m,Q;
namespace FBI {
struct node {
int a[3][3],n,m;
node() {
memset(a,0,sizeof(a));
}
node(int x) {
n = m = x;
memset(a,0,sizeof(a));
for(int i = 1;i <= x;++i) a[i][i] = 1;
}
node(int x,int y) {
n = x,m = y;
memset(a,0,sizeof(a));
}
};
node operator * (const node &A,const node &B) {
int n = A.n,m = B.m,K = A.m;
node ret(n,m);
for(int k = 1;k <= K;++k) {
for(int i = 1;i <= n;++i) {
for(int j = 1;j <= m;++j) {
ret.a[i][j] += 1ll * A.a[i][k] * B.a[k][j] % mod;
ret.a[i][j] %= mod;
}
}
}
return ret;
}
node fbi(1,2),tmp(2,2),lin[N],row[N];
void pre() {
fbi.a[1][1] = C2,fbi.a[1][2] = C1;
tmp.a[1][1] = tmp.a[1][2] = tmp.a[2][1] = 1;
row[0].n = row[0].m = 2;row[0].a[1][1] = row[0].a[2][2] = 1;
for(int i = 1;i <= m;++i) row[i] = row[i - 1] * tmp;
lin[0].n = lin[0].m = 2;
lin[0].a[1][1] = lin[0].a[2][2] = 1;
for(int i = 1;i <= n;++i) lin[i] = lin[i - 1] * row[m];
}
int solve(ll x) {
if(x == -1) return (C2 - C1 + mod) % mod;
if(x == 0) return C1;
if(x == 1) return C2;
--x;
int y = x % m;
x /= m;
return (fbi * lin[x] * row[y]).a[1][1];
}
int main(ll x) {
return (1ll * solve(x + 1) * solve(x) % mod - 1ll * C1 * (C2 - C1) % mod + mod) % mod;
}
}
ll p(ll x,ll y) {
ll z = (x - 1) * m + y;
if(ma[z]) return ma[z];
return z;
}
ll cnt = 1,ans;
void solve(int x,int y) {
++cnt;
if(x == n && y == m) return;
int down = INF,right = INF;
if(x != n) down = FBI::main(p(x + 1,y));
if(y != m) right = FBI::main(p(x,y + 1));
if(down <= right) {
ans += cnt * down % mod;
ans %= mod;
solve(x + 1,y);
}
else {
ans += cnt * right % mod;
ans %= mod;
solve(x,y + 1);
}
return;
}
int main() {
n = read(),m = read(),Q = read(),mod = read(),C1 = read(),C2 = read();
for(int i = 1;i <= Q;++i) {
ll x = read(),y = read(),tx = x,ty = y;
if(ma[x]) tx = ma[x];
if(ma[y]) ty = ma[y];
ma[x] = ty;ma[y] = tx;
}
FBI::pre();
if(ma[1]) ans += FBI::main(ma[1]),ans %= mod;
else ans += FBI::main(1),ans %= mod;
solve(1,1);
cout<<ans;
return 0;
}
bzoj4490 随机数生成器Ⅱ加强版的更多相关文章
- bzoj4471 bzoj4490 随机数生成器Ⅱ
Description 继NOI2014后,小H又发现了一种新的生成随机数的方法.首先,给定三个随机种子P,C1,C2(C1≤C2)生成一个序列{xi},{xi}满足对于任意的i≥0,满足以下递推式X ...
- 【原创】开源Math.NET基础数学类库使用(13)C#实现其他随机数生成器
本博客所有文章分类的总目录:[总目录]本博客博文总目录-实时更新 开源Math.NET基础数学类库使用总目录:[目录]开源Math.NET基础数学类库使用总目录 前言 ...
- 【BZOJ-3122】随机数生成器 BSGS
3122: [Sdoi2013]随机数生成器 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 1362 Solved: 531[Submit][Sta ...
- BZOJ-2875 随机数生成器 矩阵乘法快速幂+快速乘
题目没给全,吃X了... 2875: [Noi2012]随机数生成器 Time Limit: 10 Sec Memory Limit: 512 MB Submit: 1479 Solved: 829 ...
- [BZOJ3671][UOJ#6][NOI2014]随机数生成器
[BZOJ3671][UOJ#6][NOI2014]随机数生成器 试题描述 小H最近在研究随机算法.随机算法往往需要通过调用随机数生成函数(例如Pascal中的random和C/C++中的rand)来 ...
- NOI2014 随机数生成器
随机数生成器 [问题描述] 小H最近在研究随机算法.随机算法往往需要通过调用随机数生成函数(例如Pascal中的random和C/C++中的rand)来获得随机性.事实上,随机数生成函数也并不是真正的 ...
- 【BZOJ 3122】 [Sdoi2013]随机数生成器 (BSGS)
3122: [Sdoi2013]随机数生成器 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 1442 Solved: 552 Description ...
- Linux下对拍脚本与随机数生成器
对拍脚本 新建一个文档 check.sh 作为对拍脚本. #!/bin/bash while(true)do #死循环 ./data > .in #运行数据生成器,将数据输出到1.in ./st ...
- 矩阵(快速幂):COGS 963. [NOI2012] 随机数生成器
963. [NOI2012] 随机数生成器 ★★ 输入文件:randoma.in 输出文件:randoma.out 简单对比 时间限制:1 s 内存限制:128 MB [问题描述] 栋 ...
随机推荐
- ASP.NET Core 部署IIS及 OFFSET 附近有语法错误解决
今天自己开发了一个订机票的微信公众号,功能基本已经完成,然后想部署到服务器实际测试下.结果部署上去出现各种问题.先安装asp.net core模块,然后发现数据库并不像在开发时一样,执行ef的命令行语 ...
- Spring(三)使用JdbcTemplate对象完成查询
查询银行账户的数量 1.建立一个项目导入jar包(ioc aop dao 连接池 数据库驱动 ),拷贝容器对应的配置文件到src下 2.在配置文件中开启组件扫描 3.写一个DAO接口定义一个查询方法 ...
- CSS中的一下小技巧1之CSS3三角形运用
使用CSS3实现三角形: 在前端页面中有很多时候会遇到需要三角形图案的时候,以前不知道可以用CSS3实现三角形的时候,一般都是叫UI把三角形图案切出来. 后来知道原来可以用CSS3实现三角形,可是用过 ...
- <自动化测试方案_7>第七章、PC端UI自动化测试
第七章.PC端UI自动化测试 UI自动化测试又分为:Web自动化测试,App自动化测试.微信小程序.微信公众号UI层的自动化测试工具非常多,比较主流的是UFT(QTP),Robot Framework ...
- VS OpenCV imread imwrite nameWindow等相关报错问题
排查过程 1. 项目属性C++目录中,包含库include 和 lib 目录了吗? 去自己的opencv安装目录中找到include 和 lib(一般在x64下有两个vc14/vc15, 我的是4.0 ...
- Linux常用保护机制
Linux程序常见用的一些保护机制 一.NX(Windows中的DEP) NX:No-eXecute.DEP:Data Execute Prevention 也就是数据不可执行,防止因为程序运行出现溢 ...
- c语言static关键字的理解
static 一.概述 在c语言中static恰当的使用能让程序更加完美,细节上的严谨,代码会更好,也更利于程序的维护与扩展. 而static使用灵活,且又有两种完全无关的用法,所以整理总结一下. 二 ...
- Webstorm 2018 激活破解
本文最后更新于 2018-5-4 可能会因为没有更新而失效.如已失效或需要修正,请留言! 问题 激活 webstorm 2018 最新版 解决步骤 License server:http://hb5. ...
- 设计模式学习系列(一)——IOC设计原则
参考转载自IoC 之 2.1 IoC基础 ——跟我学Spring3
- Linux Docker的部署
1.安装 $ yum -y install docker 2.启动docker服务 $ systemctl start docker 3.设置开启自启 $ systemctl enable docke ...