【BZOJ】3240: [Noi2013]矩阵游戏
题意
给出\(n, m(1 \le n, m \le 10^{1000000})\),求\(f(n, m) \ \mod \ 10^9+7\)
$$
\begin{cases}
f(1, 1) = 1 \\
f(i, 1) = cf(i-1, m) + d \\
f(i, j) = af(i, j-1) + b & (j \neq 1)
\end{cases}
$$
其中\(1 \le a, b, c, d \le 10^9\)
分析
对于递推式\(f_i = af_{i-1} + b\)
当\(a=1\)时通项为\(f_n = f_1 + (n-1) b\)
当\(a \neq 1\)时通项为\(f_n = a^{n-1} f_1 + \frac{b(a^{n-1} - 1)}{a-1}\)
那么根据上式可以求出对应的系数
\]
然后又得到
\]
就可以推出\(f(n, 1)\),最后再逆推回\(f(n, m)\)即可。
题解
快速幂部分,可以根据欧拉定理\(a^{\varphi(p)} \equiv 1 \pmod{p}, (a, p)=1\)可以知道\(a^{10^9+6} \equiv 1 \pmod{10^9+7}\)
所以我们可以在读入的时候就对\(n, m\)模\(10^9+6\)然后再快速幂。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mo=1e9+7;
int ipow(int a, int b) {
if(a>=mo) {
a%=mo;
}
int x=1;
for(; b; b>>=1, a=(ll)a*a%mo) {
if(b&1) {
x=(ll)x*a%mo;
}
}
return x;
}
void getint(int &n, int &nn) {
char c=getchar();
n=nn=0;
for(; c<'0'||c>'9'; c=getchar());
for(; c>='0'&&c<='9'; c=getchar()) {
n=((ll)n*10+c-'0')%mo;
nn=((ll)nn*10+c-'0')%(mo-1);
}
}
int main() {
int n, m, nn, mm, a, b, c, d, ans;
getint(n, nn);
getint(m, mm);
scanf("%d%d%d%d", &a, &b, &c, &d);
int k, j;
if(a==1) {
k=c;
j=((ll)c*(m-1+mo)%mo*b%mo+d)%mo;
}
else {
int p=ipow(a, mm-1+(mo-1));
k=(ll)c*p%mo;
j=((ll)b*c%mo*(1-p+mo)%mo*ipow(1-a+mo, mo-2)%mo+d)%mo;
}
if(k==1) {
ans=((ll)n*j%mo+1)%mo;
}
else {
int p=ipow(k, nn);
ans=((ll)j*ipow(1-k+mo, mo-2)%mo*(1-p+mo)%mo+p)%mo;
}
ans=(ans-d+mo)%mo;
ans=(ll)ans*ipow(c, mo-2)%mo;
printf("%d\n", ans);
return 0;
}
【BZOJ】3240: [Noi2013]矩阵游戏的更多相关文章
- bzoj 3240: [Noi2013]矩阵游戏 矩阵乘法+十进制快速幂+常数优化
3240: [Noi2013]矩阵游戏 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 613 Solved: 256[Submit][Status] ...
- BZOJ 3240: [Noi2013]矩阵游戏
3240: [Noi2013]矩阵游戏 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 1586 Solved: 698[Submit][Status ...
- BZOJ 3240([Noi2013]矩阵游戏-费马小定理【矩阵推论】-%*s-快速读入)
3240: [Noi2013]矩阵游戏 Time Limit: 10 Sec Memory Limit: 256 MB Submit: 123 Solved: 73 [ Submit][ St ...
- BZOJ 3240 [Noi2013]矩阵游戏 ——费马小定理 快速幂
发现是一个快速幂,然而过不去. 怎么办呢? 1.十进制快速幂,可以用来练习卡时. 2.费马小定理,如果需要乘方的地方,可以先%(p-1)再计算,其他地方需要%p,所以需要保存两个数. 然后就是分类讨论 ...
- (十进制高速幂+矩阵优化)BZOJ 3240 3240: [Noi2013]矩阵游戏
题目链接: http://www.lydsy.com/JudgeOnline/problem.php?id=3240 3240: [Noi2013]矩阵游戏 Time Limit: 10 Sec M ...
- 3240: [Noi2013]矩阵游戏
Description 婷婷是个喜欢矩阵的小朋友,有一天她想用电脑生成一个巨大的n行m列的矩阵(你不用担心她如何存储).她生成的这个矩阵满足一个神奇的性质:若用F[i][j]来表示矩阵中第i行第j列的 ...
- P1397 [NOI2013]矩阵游戏(递推)
P1397 [NOI2013]矩阵游戏 一波化式子,$f[1][m]=a^{m-1}+b\sum_{i=0}^{m-2}a^i$,用快速幂+逆元求等比数列可以做到$logm$ 设$v=a^{m-1}, ...
- bzoj 1059: [ZJOI2007]矩阵游戏 二分图匹配
1059: [ZJOI2007]矩阵游戏 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1891 Solved: 919[Submit][Statu ...
- BZOJ 1059 [ZJOI2007]矩阵游戏
1059: [ZJOI2007]矩阵游戏 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2707 Solved: 1322[Submit][Stat ...
随机推荐
- Android系统中默认值的意义列表
转自:http://blog.csdn.net/yabg_zhi_xiang/article/details/51727844 在SettingsProvider中设置系统中默认值,我们可以在fram ...
- Pyqt 设置 背景颜色和背景图片、 QPalette 调色板 与QPainter 画板区别 、 不规则图片
设置 背景颜色和背景图片 首先设置autoFillBackground属性为真然后定义一个QPalette对象设置QPalette对象的背景属性(颜色或图片)最后设置QWidget对象的Palette ...
- angularJS 二
angularJS 2.1 ngForm <!DOCTYPE html> <html lang="zh-cn" ng-app> <head> ...
- hdu 4045 2011北京赛区网络赛F 组合数+斯特林数 ***
插板法基础知识 斯特林数见百科 #include<iostream> #include<cmath> #include<cstdio> #include<cs ...
- Java 类装载器
类装载器 基本概念: 顾名思义,类加载器(class loader)用来把Java 类动态的加载到 Java 虚拟机中.也就是说当程序需要某个类时,类加载器就把这个类的二进行加入到虚拟机中. 类加载器 ...
- android 消息推送
android 消息推送 极光推送百度云推送(语音)友盟消息推送
- Element selector doesn't have required
这个错误是因为创建xml文件时文件类型弄成了layout xml file ,这样就会自动到layout文件夹下 应该是drawable resource file
- Linux学习笔记(16)shell基础之Bash变量
1. 用户自定义变量 (1)变量设置规则 ① 变量名称可由字母.数字和下划线组成,但不能以数字开头: ② 变量的默认类型为字符串类型,如果要对数值运算,则必须指定变量类型为数值型: ③ 变量用等号连接 ...
- SQL初级第三课(上)
先建立一个表 create table Student --学生(Sno char(3) primary key , --学生学号Sname ...
- Linux中cp覆盖不提示
cp覆盖时,无论加什么参数-f之类的还是提示是否覆盖,这在大量cp覆盖操作的时候是不能忍受的. 1. 把a目录下的文件复制到b目录 cp –r a/* b 2. 执行上面的命令时,b存在的每个文件都会 ...