hdu6395 Sequence(分段矩阵快速幂)
2024-09-01 00:45:28
Sequence
解题思路
可以比较容易的推出矩阵方程,但是由于p/i向下取整的值在变,所以要根据p/i的变化将矩阵分段快速幂。p/i一共有sqrt(p)种结果,所以最多可以分为sqrt(p)段进行快速幂。
代码如下
#include <bits/stdc++.h>
#define INF 0x3f3f3f3f
using namespace std;
typedef long long ll;
inline int read(){
int res = 0, w = 0; char ch = 0;
while(!isdigit(ch)){
w |= ch == '-', ch = getchar();
}
while(isdigit(ch)){
res = (res << 3) + (res << 1) + (ch ^ 48);
ch = getchar();
}
return w ? -res : res;
}
const int N = 100005;
const int mod = 1e9+7;
struct Matrix{
ll m[3][3];
Matrix(){
memset(m, 0, sizeof(m));
}
};
Matrix mul(Matrix& x, Matrix& y)
{
Matrix ans;
for(int i = 0; i < 3; i ++){
for(int j = 0; j < 3; j ++){
for(int k = 0; k < 3; k ++)
ans.m[i][j] = (x.m[i][k] * y.m[k][j] % mod + ans.m[i][j]) % mod;
}
}
return ans;
}
Matrix sq_pow(Matrix& x, int k)
{
Matrix t = x;
Matrix ans;
ans.m[0][0] = 1, ans.m[1][1] = 1, ans.m[2][2] = 1;
while(k){
if(k & 1)
ans = mul(ans, t);
t = mul(t, t);
k >>= 1;
}
return ans;
}
int main()
{
int t;
cin >> t;
while(t --){
ll a, b;
int c, d, p, n;
cin >> a >> b >> c >> d >> p >> n;
Matrix t;
t.m[0][0] = d, t.m[0][1] = c, t.m[1][0] = 1, t.m[2][2] = 1;
if(n == 1)
printf("%lld\n", a % mod);
else if(n == 2)
printf("%lld\n", b % mod);
else {
for(int i = 3; i <= n; ){
//printf("b: %lld\n", b % mod);
t.m[0][2] = p / i;
if(p / i == 0){
Matrix temp = sq_pow(t, n - i + 1);
b = (b * temp.m[0][0] + a * temp.m[0][1] + temp.m[0][2]) % mod;
break;
}
else {
int j = p / (p / i);
j = min(j, n);
Matrix temp = sq_pow(t, j - i + 1);
ll tb = (b * temp.m[0][0] + a * temp.m[0][1] + temp.m[0][2]) % mod;
ll ta = (b * temp.m[1][0] + a * temp.m[1][1] + temp.m[1][2]) % mod;
a = ta, b = tb;
i = j + 1;
}
}
printf("%lld\n", b % mod);
}
}
return 0;
}
最新文章
- Flexible 弹性盒子模型之CSS flex-basis 属性
- Disk Space Usage 术语理解:unallocated, unused and reserved
- Apache Shiro系列三,概述 —— 10分钟入门
- centos7下 安装mysql
- 一年成为emacs高手
- JS根据身份证号码算年龄
- [原创] Linux下几种文件传输命令 sz rz sftp scp介绍
- C++11 删除链表重复数值
- TF Boys (TensorFlow Boys ) 养成记(三)
- java08双重循环打印图形
- linux环境下编码的问题
- 3522: [Poi2014]Hotel( 树形dp )
- APIJSON-以坚持和偏执,回敬傲慢和偏见
- 关于TOE(TCP/IP Offload Engine)
- python中 requests 支持 socks代理
- 判断是否滚动加载结束 用一个公共变量isScroll来控制
- Winform开发框架之图表报表在线设计器2-图表-SNF.EasyQuery项目--SNF快速开发平台3.3-Spring.Net.Framework
- HDU 1568 Fibonacci(大数前4位)
- HTML文字闪烁
- Day Nine
热门文章
- Qt+QZXing编写识别二维码的程序
- elasticsearch local debug环境搭建
- Spring的Bean的生命周期
- 3012C语言_数据
- sublimetext插件安装
- wireshark和nmap
- 系统学习 Java IO (九)----缓冲流 BufferedInputStream/BufferedOutputStream
- Java 8 新特性-Stream更优雅的处理集合入门
- asp.net core 2.2 生产环境直接更新View页面并立即生效
- Python编程菜鸟成长记--A1--02--Python介绍