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 ...
随机推荐
- Sql server 中count() 与 sum() 的区别
一句话概括就是Sum(列) 是求和,把所有列的值进行汇总求和:COUNT(列) 是行数汇总,只要列的值不为Null,就会增加1: 举个例子说明下: --创建临时表结构 CREATE TABLE Tem ...
- Django多对多关系建立及Form组件
目录 Django多对多关系 1.创建方式一全自动 2.创建方式二纯手撸 3.半自动(推荐使用) forms校验组件 使用forms组件实现注册功能 form常用字段和插件 数据校验 钩子函数 HOO ...
- 项目element-ui checkbox里面获取选中项 实现批量删除 修改
<el-table :data="tableData" stripe border style="width: 100%" @selection-chan ...
- WinRAR 去广告的姿势
一直在使用WinRAR解压文件,感觉非常的好用,可是现在WinRAR添加了广告,每次打开压缩包都会弹出广告,有时候甚至在解压的时候弹出来,而每次弹出广告都会卡顿一下,忍了很长时间今天实在是受够了,准备 ...
- [ZJOI2007]捉迷藏 (线段树,括号序列)
大意: 给定树, 要求维护一个点集, 支持删点添点, 询问点集直径. 本题做法比较多. 一个显然的做法是, 线段树维护区间直径, 然后根据点集直径的性质, 合并后直径端点一定是四个端点其中两个, 枚举 ...
- 怎样理解数组的空元素empty与undefined的区别
数组的空元素empty表示空位, 它不是一种数据类型, 而是由于人为修改arr.length 或者写入时多写了逗号造成的. var arr = [1,2,3,4,,,5]; arr.length; a ...
- JS OOP -01 面向对象的基础
JS面向对象的基础: 1.用定义函数的方式定义类 2.用new操作符获得一个类的实例 3.使用 [ ] 引用对象的属性和方法 4.动态添加,修改,删除对象的属性和方法 5.使用 { } 语法创建无类型 ...
- 将mdf文件copy到docker对应的目录下
将mdf文件copy到docker对应的目录下: (<Docker-Container ID> 需要整体替换) docker cp /Users/Jay/Works/db/MyPost.m ...
- SOLID Principles
Intention: more understandable, easier to maintain and easier to extend.(通过良好的设计使得代码easy and simple, ...
- Form key length limit 2048 exceeded ,提交数据时,数据的键过长 或者是上传文件过大
在ASP.NET Core MVC中,文件的key 默认最大为2048,文件上传的最大上传文件默认为20MB,如果我们想上传一些比较大的文件,就不知道怎么去设置了,没有了Web.Config我们应该如 ...