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;
}

最新文章

  1. Flexible 弹性盒子模型之CSS flex-basis 属性
  2. Disk Space Usage 术语理解:unallocated, unused and reserved
  3. Apache Shiro系列三,概述 —— 10分钟入门
  4. centos7下 安装mysql
  5. 一年成为emacs高手
  6. JS根据身份证号码算年龄
  7. [原创] Linux下几种文件传输命令 sz rz sftp scp介绍
  8. C++11 删除链表重复数值
  9. TF Boys (TensorFlow Boys ) 养成记(三)
  10. java08双重循环打印图形
  11. linux环境下编码的问题
  12. 3522: [Poi2014]Hotel( 树形dp )
  13. APIJSON-以坚持和偏执,回敬傲慢和偏见
  14. 关于TOE(TCP/IP Offload Engine)
  15. python中 requests 支持 socks代理
  16. 判断是否滚动加载结束 用一个公共变量isScroll来控制
  17. Winform开发框架之图表报表在线设计器2-图表-SNF.EasyQuery项目--SNF快速开发平台3.3-Spring.Net.Framework
  18. HDU 1568 Fibonacci(大数前4位)
  19. HTML文字闪烁
  20. Day Nine

热门文章

  1. Qt+QZXing编写识别二维码的程序
  2. elasticsearch local debug环境搭建
  3. Spring的Bean的生命周期
  4. 3012C语言_数据
  5. sublimetext插件安装
  6. wireshark和nmap
  7. 系统学习 Java IO (九)----缓冲流 BufferedInputStream/BufferedOutputStream
  8. Java 8 新特性-Stream更优雅的处理集合入门
  9. asp.net core 2.2 生产环境直接更新View页面并立即生效
  10. Python编程菜鸟成长记--A1--02--Python介绍