2019牛客多校B generator 1——十进制快速幂
题目
已知 $x_i = ax_i + bx_{i-1}$,求 $x_n \% MOD$.($1\leq n\leq 10^{(10^6)}$)
分析
写成矩阵快速幂的形式,相当于求转移矩阵的 $n$ 次幂。
由于 $n$ 过大,只能用字符串形式保存,如果转成二进制复杂度过高,就直接用十进制好了。
其实十进制快速幂和二进制几乎一样,都是倍增的思想。
ll qpow(ll a, ll b, ll p)
{
ll ret = ;
while(b)
{
if(b&) ret = ret*a%p;
a = a*a%p;
b >>= ;
}
return ret;
} inline ll shi_pow(ll a, ll b, ll p)
{
ll ret = ;
while(b)
{
ll yu = b%;
if(yu) ret = ret*qpow(a,yu,p)%p;
a = qpow(a, , p);
b /= ;
}
return ret;
}
二进制更快,里面能用二进制的换成了二进制。
回到题目,将字符串 $n$ 从高到低就是十进制,与上面类似
#include<bits/stdc++.h>
using namespace std; typedef long long ll;
const int N=+;
ll x0,x1,a,b,mod;
char s[N]; struct Mat{
int r,c;
ll m[][];
Mat(){
//memset(m,0,sizeof(m));
for(int i = ;i < ;i++)
for(int j = ;j < ;j++)
m[i][j]=;
}
}; inline Mat mmul(Mat x,Mat y,ll p){
Mat ans;
ans.r=x.r;
ans.c=y.c;
for(int i=;i<x.r;i++)
for(int k=;k<x.c;k++)
for(int j=;j<y.c;j++){
ans.m[i][j] = (ans.m[i][j] + x.m[i][k]*y.m[k][j])%p;
}
return ans;
} inline Mat mpow(Mat x,ll y,ll p){
Mat ans;
ans.r=x.r;
ans.c=x.c;
for(int i=;i<ans.c;i++) ans.m[i][i]=;
while(y){
if(y&) ans=mmul(ans,x,p);
x=mmul(x,x,p);
y>>=;
}
return ans;
} inline Mat m_shi_pow(Mat x,char* s,ll p){
Mat ans;
ans.r=x.r;
ans.c=x.c;
int len = strlen(s);
for(int i=;i<ans.c;i++) ans.m[i][i]=;
while(len--){
int yu = (s[len]-''); //printf("yu:%d\n", yu);
if(yu) ans=mmul(ans,mpow(x, yu, p),p);
x=mpow(x,,p);
}
return ans;
} int main(){
scanf("%lld%lld%lld%lld", &x0, &x1, &a, &b);
scanf("%s%lld", s, &mod);
Mat A,T;
A.r=; A.c=;
A.m[][]=x1; A.m[][]=x0;
T.r=; T.c=;
T.m[][]=a; T.m[][]=b; T.m[][]=; T.m[][]=;
T = m_shi_pow(T, s, mod);
A = mmul(T, A, mod);
printf("%lld\n", A.m[][]); return ;
}
这题有点卡常,加些常数优化才抖过去。
2019牛客多校B generator 1——十进制快速幂的更多相关文章
- 2019牛客多校第一场 I Points Division(动态规划+线段树)
2019牛客多校第一场 I Points Division(动态规划+线段树) 传送门:https://ac.nowcoder.com/acm/contest/881/I 题意: 给你n个点,每个点有 ...
- 2019牛客多校第二场 A Eddy Walker(概率推公式)
2019牛客多校第二场 A Eddy Walker(概率推公式) 传送门:https://ac.nowcoder.com/acm/contest/882/A 题意: 给你一个长度为n的环,标号从0~n ...
- 2019牛客多校第八场 F题 Flowers 计算几何+线段树
2019牛客多校第八场 F题 Flowers 先枚举出三角形内部的点D. 下面所说的旋转没有指明逆时针还是顺时针则是指逆时针旋转. 固定内部点的答案的获取 anti(A)anti(A)anti(A)或 ...
- 2019牛客多校 Round4
Solved:3 Rank:331 B xor 题意:5e4个集合 每个集合最多32个数 5e4个询问 询问l到r个集合是不是都有一个子集的xor和等于x 题解:在牛客多校第一场学了线性基 然后这个题 ...
- 2019牛客多校第五场 B - generator 1 矩阵快速幂+十倍增+二进制倍增优化
B - generator 1 题意 给你\(x_{0}.x_{1}.a.b.b.mod\),根据\(x_{i} = a*x_{i-1} + b*x_{i-2}\)求出\(x_{n}\) 思路 一般看 ...
- 2019牛客多校第五场B generator 十进制快速幂
generator 1 题意 给出\(x_0,x_1,a,b\)已知递推式\(x_i=a*x_{i-1}+b*x_{i-2}\),出个n和mod,求\(x_n\) (n特别大) 分析 比赛的时候失了智 ...
- 2019牛客多校第一场E ABBA(DP)题解
链接:https://ac.nowcoder.com/acm/contest/881/E 来源:牛客网 ABBA 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 524288K,其他语 ...
- 2019牛客多校第四场 I题 后缀自动机_后缀数组_求两个串de公共子串的种类数
目录 求若干个串的公共子串个数相关变形题 对一个串建后缀自动机,另一个串在上面跑同时计数 广义后缀自动机 后缀数组 其他:POJ 3415 求两个串长度至少为k的公共子串数量 @(牛客多校第四场 I题 ...
- 2019牛客多校第四场 A meeting
链接:https://ac.nowcoder.com/acm/contest/884/A来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 524288K,其他语言10485 ...
随机推荐
- java模拟from表单提交,上传图片
/** * java上传表单,有图片 * @param urlStr 上传地址 * @param textMap 表单参数 * @param fileMap 文件参数 key:文件名称 value:文 ...
- Python--读取数据库
原文地址:https://www.wukong.com/answer/6591280609824342286/?iid=40708017633&app=news_article&sha ...
- gdb调试命令总结
常用命令: l 列出源代码 每次默认列10行 list 行号 列出从第几行开始的源代码 list函数名 列出某个函数的源代码 r 运行程序 next(或n) 执行下一行语句 ...
- Ubuntu截图工具Flameshot
今天来介绍一款Ubuntu下的截图工具,名叫Flameshot. 安装 Flameshot的安装很简单. 命令行安装 sudo apt-get install flameshot 一条命令搞定! 软件 ...
- S03_CH11_基于TCP的QSPI Flash bin文件网络烧写
S03_CH11_基于TCP的QSPI Flash bin文件网络烧写 11.1概述 针对ZYNQ中使用QSPI BOOT的应用,将BOOT.bin文件烧写至QSPI Flash基本都是通过USB C ...
- echarts配置项说明//持续添加
<template> <div> <!-- <h2>本月抄表完成率</h2> --> <!-- <div id=&qu ...
- 怎样理解构造函数的原型对象prototype
通过构造函数生成的实例对象中的属性和方法其实是从构造函数中"copy"一份后生成的, 也就是说虽然生成的对象是构造函数的实例, 但里面的属性和方法确实相互独立的, 比如下面的lil ...
- POJ1065(Wooden Sticks)--贪心
木棍 时间限制: 1000MS 内存限制: 10000K 提交总数: 27336 接受: 11857 描述 有一堆木棍.每根杆的长度和重量是预先已知的.这些木棍将由木工机器逐一加工.它需要一些 ...
- mycat 报错 java.lang.OutOfMemoryError: Java heap space
今天排查mysql的错误日志发现 wrapper.log 中有如下错误日志 INFO | jvm 1 | 2019/10/20 12:52:31 | java.lang.OutOfMem ...
- UDP及操作系统理论
UDP介绍 udp协议又称用户数据报协议 在OSI七层模型中,它于TCP共同存在于传输层 仅用于不要求可靠性,不要求分组顺序且数据较小的简单传输,力求速度 UDP结合socket用法 1.创建sock ...