[hdu-6395]Sequence 分块+矩阵快速幂
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6395
因为题目数据范围太大,又存在递推关系,用矩阵快速幂来加快递推。
每一项递推时 加的下取整的数随着n变化,但因为下取整有连续性(n一段区间下取整的数是相同的),可以分块,相同的用矩阵快速幂加速
想了好久。。如果最小的开始的值是【p/i】的数为i,那连续的一段长度是【p/(p/i)】-i+1,但为什么分段数是根号n级别啊?。。。
套矩阵快速幂,时间复杂度O(sqrt(n) * log(n))
一个递推关系式
可以用矩阵乘法来表示递推关系
有两种写法

至于怎么求特征值矩阵(用来加速的那个矩阵),就是根据关系式,观察前后两个的变化与联系填就好了
为了写着省事用了第一种,但其实它复杂度高,推荐第二种
坑:
1.n=1 和 n=2 要特判
2.如果n>p,最后加的下取整的数为0,要特判,且特判的时候,注意长度不是【n-p】,p可能比2小,而我们矩阵的第一项是从F2 开始的,应为[n-max(2,p)]
3.矩阵快速幂三层循环的变量不要写错,。。一开始把第三层的k写成 i 死循环了
4.运算符重载后不要用scanf输入,在一些oj上会超时
5.max、min函数比较的是同一种变量
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
using namespace std;
typedef long long ll;
const int p=1e9+;
ll aa,b,c,d,mo,n;
struct matrix
{
ll a[][];
ll* operator [](int x) {return a[x];}//这里是*不是&
matrix operator *(matrix b)//重载*运算符
{
matrix c;
memset(c.a,,sizeof(c.a));
ll tmp;
for (int i=;i<=;i++) {
tmp=;
for (int j=;j<=;c[i][j]=tmp%p,tmp=,j++)
for (int k=;k<=;k++) tmp+=(a[i][k]*b[k][j])%p;
}
//前提p^3不爆LL可以在第二层再取模
return c;
}
matrix operator ^(ll T)
{
matrix a=*this,b;//this是指针,所以是*this,这样才可以保证原来的a并不改变
memset(b.a,,sizeof(b.a));
for (int i=;i<=;i++) b[i][i]=;
for (;T;a=a*a,T>>=) if (T&) b=b*a;
return b;
}
};
matrix ans;
void work(ll ci,ll chang){
ans[][]=chang;
matrix node;
node[][]=d,node[][]=,node[][]=;
node[][]=c,node[][]=,node[][]=;
node[][]=,node[][]=,node[][]=;
matrix ping=node^ci;
ans=ans*ping;
}
int main(){
int t;
scanf("%d",&t);
for(int p=;p<=t;p++){
cin>>aa>>b>>c>>d>>mo>>n;
if(n==){
cout<<aa;continue;//运算符重载后不要用scanf输入
}
else if(n==){
cout<<b;continue;
}
else{ ans[][]=b,ans[][]=aa;
for(int i=;i<=;i++){
ans[][i]=;ans[][i]=;
}
for(ll i=,j;i<=n;i=j+){
if(mo/i==)break;
j=mo/(mo/i);
if(n<j)j=n;
work(j-i+,mo/i);
}
ll w=;
if(mo>w)w=mo;
if(n>mo)work(n-w,);//一定不要直接用n-mo,如果mo是1会错误,要与2进行大小比较
cout<<ans[][]<<endl;
}
}
return ;
}
再附上一个矩阵快速幂的板子:
struct matrix
{
int n,m;
LL a[maxk][maxk];
LL* operator [](int x) {return a[x];}//这里是*不是&
matrix operator *(matrix b)
{
int i,j,kk;
matrix c;
c.n=n,c.m=b.m;
memset(c.a,,sizeof(c.a));
LL tmp;
for (i=;i<=n;i++) for (j=,tmp=;j<=b.m;c[i][j]=tmp%p,tmp=,j++)
for (kk=;kk<=m;kk++) tmp+=a[i][kk]*b[kk][j];
return c;
}
matrix operator ^(LL T)
{
matrix a=*this,b;//this是指针,所以是*this,这样才可以保证原来的a并不改变
memset(b.a,,sizeof(b.a));
b.n=n,b.m=m;
for (int i=;i<=n;i++) b[i][i]=;
for (;T;a=a*a,T>>=) if (T&) b=b*a;
return b;
}
};
/*
ll* 返回的是指针,也就是 a[x]是一个指针(相当于返回第x行第0列的数值的指针),a[x][y]是一个数值,在外面调用a[x][y]时,相当于(m.a[x])[y]
F1F2Fn===ABC⋅Fn−2+D⋅Fn−1+⌊Pn⌋
[hdu-6395]Sequence 分块+矩阵快速幂的更多相关文章
- HDU 6395 Sequence 【矩阵快速幂 && 暴力】
任意门:http://acm.hdu.edu.cn/showproblem.php?pid=6395 Sequence Time Limit: 4000/2000 MS (Java/Others) ...
- HDU 5667 Sequence(矩阵快速幂)
Problem Description Holion August will eat every thing he has found. Now there are many foods,but he ...
- HDU 5667 Sequence【矩阵快速幂+费马小定理】
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5667 题意: Lcomyn 是个很厉害的选手,除了喜欢写17kb+的代码题,偶尔还会写数学题.他找到 ...
- Sequence( 分块+矩阵快速幂 )
题目链接 #include<bits/stdc++.h> using namespace std; #define e exp(1) #define pi acos(-1) #define ...
- 杭电多校第七场 1010 Sequence(除法分块+矩阵快速幂)
Sequence Problem Description Let us define a sequence as below f1=A f2=B fn=C*fn-2+D*fn-1+[p/n] Your ...
- HDU.1575 Tr A ( 矩阵快速幂)
HDU.1575 Tr A ( 矩阵快速幂) 点我挑战题目 题意分析 直接求矩阵A^K的结果,然后计算正对角线,即左上到右下对角线的和,结果模9973后输出即可. 由于此题矩阵直接给出的,题目比较裸. ...
- hdu 3117 Fibonacci Numbers 矩阵快速幂+公式
斐波那契数列后四位可以用快速幂取模(模10000)算出.前四位要用公式推 HDU 3117 Fibonacci Numbers(矩阵快速幂+公式) f(n)=(((1+√5)/2)^n+((1-√5) ...
- HDU - 6395 Sequence (整除分块+矩阵快速幂)
定义数列: $\left\{\begin{eqnarray*} F_1 &=& A \\ F_2 &=& B \\ F_n &=& C\cdot{}F_ ...
- HDU-6395 多校7 Sequence(除法分块+矩阵快速幂)
Sequence Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others)Total ...
随机推荐
- UVa 11400 Lighting System Design(DP 照明设计)
意甲冠军 地方照明系统设计 总共需要n不同类型的灯泡 然后进入 每个灯电压v 相应电压电源的价格k 每一个灯泡的价格c 须要这样的灯泡的数量l 电压低的灯泡能够用电压高的灯泡替换 ...
- Harden the Hacker Thinking (Updating)
录制自己的最新思考harden过程.通过记录,反射,加强管理,发现缺陷. 等一下design,等一下coding,三十分钟rethinking. 2015-02-26 : 不要在一件事上停留太久: 歇 ...
- go语言学习之路(一)
Go 语言简介 Go 是一个开源的编程语言,它能让构造简单.可靠且高效的软件变得容易. Go是从2007年末由Robert Griesemer, Rob Pike, Ken Thompson主持开发, ...
- jquery 显示图片
<!DOCTYPE html><html><head><meta http-equiv="Content-Type" content=&q ...
- WPF MvvmLight简单实例(1) 页面导航
原文:WPF MvvmLight简单实例(1) 页面导航 实现了那些功能,先看看截图: 操作描述: 在程序运行后,点击“Load”按钮,页面会加载PageOne,点击PageOne页面中的“Next” ...
- SQLServer 进程无法向表进行大容量复制(错误号: 22018 20253)
原文:SQLServer 进程无法向表进行大容量复制 我的环境:SQL SERVER 2008 R2:发布者 ->SQL SERVER 2017 订阅者 进程无法向表“"dbo&quo ...
- 【转载】动态载入DLL所需要的三个函数详解(LoadLibrary,GetProcAddress,FreeLibrary)
原文地址:https://www.cnblogs.com/westsoft/p/5936092.html 动态载入 DLL 动态载入方式是指在编译之前并不知道将会调用哪些 DLL 函数, 完全是在运行 ...
- C#二分查找法 破洞百出版本
二分查找法在数据繁多的数据中查找是一种快速的方法,每次查找最多需要的次数 为2的n次方小于总个数. 当然是有前提的,就是需要把数据先排好序,这里指的都是数值型的数据. 基本思想就是把需要找的值与排序好 ...
- Windows Python虚拟环境配置(Distribute + pip + virtualenv + virtualenvwrapper-powershell)
对于Python开发新手,很多人会迷茫那些各种名目的工具和概念,如Python2.7, Python3.3, Distribute, pip, virtualenv,Setuptools, easy_ ...
- Qt5---ftp上传功能(使用组合的办法实现功能,QNetworkAccessManager自动管理分片上传,用QLoggingCategory屏蔽SSL警告)
从Qt的版本进化中可以知道,在Qt4中的QFtp类到了Qt5中已经没有了,虽然可以通过在Qt5中自己编译出QFtp,但是Qt5中提供的QNetworkAccessManager在发送和请求网络方面 ...