hdu6395 Sequence(分段矩阵快速幂)
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;
}
												
											hdu6395 Sequence(分段矩阵快速幂)的更多相关文章
- [hdu-6395]Sequence  分块+矩阵快速幂
		
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6395 因为题目数据范围太大,又存在递推关系,用矩阵快速幂来加快递推. 每一项递推时 加的下取整的数随 ...
 - HDU 6395 Sequence(分段矩阵快速幂)题解
		
题意: 已知\(A,B,C,D,P,n\)以及 \[\left\{ \begin{aligned} & F_1 = A \\ & F_2 = B\\ & F_n = C*F_{ ...
 - HDU 6395  分段矩阵快速幂     HDU 6386   建虚点+dij
		
http://acm.hdu.edu.cn/showproblem.php?pid=6395 Sequence Time Limit: 4000/2000 MS (Java/Others) Me ...
 - BZOJ 2326 数学作业(分段矩阵快速幂)
		
实际上,对于位数相同的连续段,可以用矩阵快速幂求出最后的ans,那么题目中一共只有18个连续段. 分段矩阵快速幂即可. #include<cstdio> #include<iostr ...
 - HDU6395(分段+矩阵快速幂)
		
题目:http://acm.hdu.edu.cn/showproblem.php?pid=6395 给你一个式子,给出你A,B,C,D,P,n,让你求出第n项的式子Fn.(其中ABCDPn均在1e9的 ...
 - 数学--数论--HDU - 6395 Let us define a sequence as below 分段矩阵快速幂
		
Your job is simple, for each task, you should output Fn module 109+7. Input The first line has only ...
 - A - Number Sequence(矩阵快速幂或者找周期)
		
Description A number sequence is defined as follows: f(1) = 1, f(2) = 1, f(n) = (A * f(n - 1) + B * ...
 - HDU 5950 Recursive sequence(矩阵快速幂)
		
题目链接:Recursive sequence 题意:给出前两项和递推式,求第n项的值. 题解:递推式为:$F[i]=F[i-1]+2*f[i-2]+i^4$ 主要问题是$i^4$处理,容易想到用矩阵 ...
 - HDU 5667 Sequence(矩阵快速幂)
		
Problem Description Holion August will eat every thing he has found. Now there are many foods,but he ...
 - HDU 6395 Sequence 【矩阵快速幂 && 暴力】
		
任意门:http://acm.hdu.edu.cn/showproblem.php?pid=6395 Sequence Time Limit: 4000/2000 MS (Java/Others) ...
 
随机推荐
- VCL比MFC好在哪里
			
作者:刘国华链接:https://www.zhihu.com/question/35218485/answer/118472021来源:知乎著作权归作者所有,转载请联系作者获得授权. 从使用感受而言, ...
 - C++迭代器 iterator
			
1. 迭代器(iterator)是一中检查容器内元素并遍历元素的数据类型.(1) 每种容器类型都定义了自己的迭代器类型,如vector:vector<int>::iterator iter ...
 - Struts2 学习笔记(概述)
			
Struts2 学习笔记 2015年3月7日11:02:55 MVC思想 Strust2的MVC对应关系如下: 在MVC三个模块当中,struts2对应关系如下: Model: 负责封装应用的状态,并 ...
 - 死磕 java同步系列之CyclicBarrier源码解析——有图有真相
			
问题 (1)CyclicBarrier是什么? (2)CyclicBarrier具有什么特性? (3)CyclicBarrier与CountDownLatch的对比? 简介 CyclicBarrier ...
 - Dart 异步编程相关概念简述
			
目录 isolate: event loop: Future: async/await: 总结 参考链接  学习 Dart 的异步编程时,需要对异步编程所涉及的相关知识体系进行梳理,我们可根据以下几 ...
 - 手动实现 SpringMVC
			
前几章我们已经分析了 Spring 的源码并且手动实现了一个 IOC/DI 容器. 这章我们在自己实现的 Spring 框架的基础上实现一个 SpringMVC 框架. 我们自己实现的 Spring ...
 - jQuery-ajax-.load方法
			
使用jQuery封装的ajax是非常好用的,这个里面提供了几个比较好用的方法. load(url[,data, callback])方法: 说明:这个是jQuery中的最底层方法$.ajax()封装的 ...
 - 跟我学SpringCloud | 第四篇:熔断器Hystrix
			
跟我学SpringCloud | 第四篇:熔断器Hystrix 1. 熔断器 服务雪崩 在正常的微服务架构体系下,一个业务很少有只需要调用一个服务就可以返回数据的情况,这种比较常见的是出现在demo中 ...
 - 跟我学SpringCloud | 第八篇:Spring Cloud Bus 消息总线
			
SpringCloud系列教程 | 第八篇:Spring Cloud Bus 消息总线 Springboot: 2.1.6.RELEASE SpringCloud: Greenwich.SR1 如无特 ...
 - 華氏溫度轉化為攝氏溫度的簡單JavaScript代碼
			
今天,跟著W3School學到了"JavaScript函數",代碼都挺簡單的,在運算符調用函數的地方寫了一個小程序.原碼程序是這樣的: <!DOCTYPE html> ...