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 [问题描述] 栋 ...
随机推荐
- js对数组进行删除
今天在项目中遇到一个问题 就是一个json对象里边是一个个数组,用户点击选中会把选中的数据从原来的数据里边删除 想了想写了一段代码,如下 let json={title:1212,reader:10 ...
- C#打印模板设计,E店宝打印模板设置,winfrom打印模板设计,DevExpress.XtraReports.UI.XRTable 表格代码生成。
一.打印效果 二.代码编辑 1 .table1 : table控件的Name: 2.label33 :label控件 实现绑定[外部平台单号]的控件: 3.label32:绑定[E店宝订单编号](S开 ...
- C# 利用位运算传递多个参数方法
前言 在工作中用sendMessage的方法向另外一个进程中传递窗体的位置,长度,宽度四个值,但是sendMessage的方法签名中只有两个参数.于是在网上找到了一些代码,找到了这个利用位运算来合并参 ...
- 再议Java中的static关键字
再议Java中的static关键字 java中的static关键字在很久之前的一篇博文中已经讲到过了,感兴趣的朋友可以参考:<Java中的static关键字解析>. 今天我们再来谈一谈st ...
- mysql 基础sql语句
1.mysqladmin语句: # 查看mysql版本 mysqladmin version # 更改root用户密码 mysqladmin -u root -p原密码 password '新密码 ...
- WSL(Windows Subsystem for Linux)--Pico Process Overview
[转载] Windows Subsystem for Linux -- Pico Process Overview Overview This post discusses pico processe ...
- python之三行代码发送邮件
(1)首先进入cmd,输入pip install yagmail (2)思路:1 .连接服务器:yagmail.SMTP(邮箱账号,邮箱密码,邮箱服务器地址,邮箱服务器端口) 2 .准备正文内容:co ...
- Webstorm 2018 激活破解
本文最后更新于 2018-5-4 可能会因为没有更新而失效.如已失效或需要修正,请留言! 问题 激活 webstorm 2018 最新版 解决步骤 License server:http://hb5. ...
- Running Spark Streaming Jobs on a Kerberos-Enabled Cluster
Use the following steps to run a Spark Streaming job on a Kerberos-enabled cluster. Select or create ...
- python defaultdict模块
from collections import defaultdict '''默认值字典'''d = defaultdict(lambda :123)print(d)print(type(d))pri ...