HDU - 6395 Sequence (分块+快速矩阵幂)
给定递推式:

求Fn.
分析:给出的公式可以用快速矩阵幂运算得到,但 P/n 整除对于不同的i,值是不同的。
可以根据P将3-n分成若干块,每块中P整除n的值是相同的。分块的时候要注意判断。
将每块的快速幂结果累乘得到结果。
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef pair<int, int> PII;
const int MAXN = 1e5+;
const int SIZE = ;
const int MOD = 1e9+;
int N;
int A, B, C, D, P;
int cc; LL ret_multi[SIZE][SIZE];
void multi(LL a[][SIZE], LL b[][SIZE])
{
memset(ret_multi, , sizeof ret_multi);
for( int i = ; i < SIZE; i++ )
for( int j = ; j < SIZE; j++)
for( int k = ; k < SIZE; k++ )
ret_multi[i][j] = (ret_multi[i][j] + a[i][k] *b[k][j]) %MOD;
for( int i = ; i < SIZE; i++ )
for( int j = ; j < SIZE; j++)
a[i][j] = ret_multi[i][j];
} LL ret_qpow[SIZE][SIZE];
LL base[SIZE][SIZE];
void qpow(LL b[][SIZE], LL index)
{
memset(ret_qpow, , sizeof ret_qpow);
memcpy(base, b, sizeof base); for( int i = ; i < SIZE; i++) ret_qpow[i][i] = ;
while(index){
if( index &)
multi(ret_qpow, base);
index /= ;
multi(base, base);
}
} LL m[][SIZE] = {
{D, C, cc},
{, , },
{, , }
}; LL f[][SIZE] = {
{B, , },
{A, , },
{, , }
}; int getRight(int cc)
{
int L = , R = N;
int ret = N;
while(L <= R){
int mid = L + (R-L)/;
if( P/mid >= cc){
ret = mid;
L = mid+;
}
else R = mid-;
}
return ret;
} vector<PII> range; int main()
{
#ifndef ONLINE_JUDGE
freopen("in.txt","r",stdin);
freopen("out.txt","w",stdout);
#endif int T; scanf("%d",&T);
while(T--){
range.clear();
scanf("%d%d%d%d%d%d",&A,&B,&C,&D,&P,&N);
if(N==){
printf("%d\n",A); continue;
}
else if(N==){
printf("%d\n",&B); continue;
}
for( int i = ; i <= N; i++ ) //分块
{
int cc = P/i;
int j = getRight(cc);
range.push_back({i, j});
i = j;
} LL m[][SIZE] = {
{D, C, cc},
{, , },
{, , }
}; LL f[][SIZE] = {
{B, , },
{A, , },
{, , }
}; for( PII rng :range){
const int &n1 = rng.first;
const int &n2 = rng.second;
cc = P/n1; m[][] = cc; qpow(m, n2-(n1-));
multi(ret_qpow, f); memcpy(f, ret_multi, sizeof f);
}
printf("%lld\n",f[][]%MOD);
}
return ;
}
HDU - 6395 Sequence (分块+快速矩阵幂)的更多相关文章
- HDU 6395 Sequence(分段矩阵快速幂)题解
题意: 已知\(A,B,C,D,P,n\)以及 \[\left\{ \begin{aligned} & F_1 = A \\ & F_2 = B\\ & F_n = C*F_{ ...
- CodeForces621E 快速矩阵幂优化dp
有时些候在用快速矩阵幂优化dp的时候,它的矩阵乘法是不那么容易被具体为题目背景的意思的,大多数时候难以理解矩阵之间相乘的实际意义,正如有时候我们不知道现在在做手头这些事情的意义,但倘若是因一个目标而去 ...
- Java大数——快速矩阵幂
Java大数——快速矩阵幂 今天做了一道水题,尽管是水题,但是也没做出来.最后问了一下ChenJ大佬,才慢慢的改对,生无可恋了.... 题目描述: 给a,b,c三个数字,求a的b次幂对c取余. 数据范 ...
- HDU 6395 Sequence 【矩阵快速幂 && 暴力】
任意门:http://acm.hdu.edu.cn/showproblem.php?pid=6395 Sequence Time Limit: 4000/2000 MS (Java/Others) ...
- HDU----(4291)A Short problem(快速矩阵幂)
A Short problem Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)T ...
- HDU - 6395 Sequence (整除分块+矩阵快速幂)
定义数列: $\left\{\begin{eqnarray*} F_1 &=& A \\ F_2 &=& B \\ F_n &=& C\cdot{}F_ ...
- Tr A(HDU 1575 快速矩阵幂模板)
Tr A Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
- HDU----(4549)M斐波那契数列(小费马引理+快速矩阵幂)
M斐波那契数列 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Total Sub ...
- HDU----(2157)How many ways??(快速矩阵幂)
How many ways?? Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)T ...
随机推荐
- 初识Python、PyCharm、Anaconda与tensorflow
最近裸辞了,未来希望转深度学习.语音识别.文本挖掘,觉得这块特别有意思,比较好玩.开始自学相关知识,为了能够独立地.系统地了解和学习相关知识,计划不定期记录和更新一些平时的学习总结,个人关于以上几个方 ...
- ApexSql Log 2016破解版&补丁
绿色破解版: http://download.csdn.net/detail/gsyifan/9316993 官网: https://www.apexsql.com/sql_tools_log.asp ...
- mac os下android 通过battery-historian进行电量分析
简单介绍下如何用battery-historian进行电量分析,因为battery-hostorian是基于go语言的框架,所以需要安装go 1.安装go 2.配置go环境变量到.bash_profi ...
- 【BZOJ】3296: [USACO2011 Open] Learning Languages(tarjan)
http://www.lydsy.com/JudgeOnline/problem.php?id=3296 显然,每群能交流的群是个强联通块 然后求出scc的数量,答案就是scc-1 #include ...
- (转)java volatile关键字
转自:http://www.cnblogs.com/aigongsi/archive/2012/04/01/2429166.html 参考:http://blog.csdn.net/imzoer/ar ...
- css3 html5画心
以下内容不是原创 我是搬运工 1. <!DOCTYPE HTML><html> <head> <meta charset="UTF-8"/ ...
- CentOS安装Oracle官方JRE
CentOS自带的JRE是OpenJDK,因为一些原因,需要换用Oracle官方出品的JRE. Oracle JRE下载地址http://java.com/zh_CN/(下载时注意选择相应版本) 可以 ...
- JS循环语句的理解
循环语句就是让程序重复性去做某些工作 最常见的就是for循环 那它的写法都有哪些呢? 1.必须要有初始值 2.要有条件判断 3.状态的改变 4.循环体 一定要控制循环多少次结束,否则就变成了死循环,消 ...
- cordova添加android平台时选择安装版本: requirements check failed for jdk 1.8
提示如上: 因为android-24 需要 jdk1.8 ,这里指定 android@5.1.1 即可 android-23,如下图
- 170214、mybatis一级和二级缓存
mybatis一级缓存是指在内存中开辟一块区域,用来保存用户对数据库的操作信息(sql)和数据库返回的数据,如果下一次用户再执行相同的请求, 那么直接从内存中读数数据而不是从数据库读取. 其中数据的生 ...