题目链接: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))

⎧⎩⎨⎪⎪⎪⎪⎪⎪F1F2Fn===ABC⋅Fn−2+D⋅Fn−1+⌊Pn⌋
⎧⎩⎨⎪⎪⎪⎪⎪⎪F1F2Fn===ABC⋅Fn−2+D⋅Fn−1+⌊Pn⌋

一个递推关系式可以用矩阵乘法来表示递推关系

有两种写法

至于怎么求特征值矩阵(用来加速的那个矩阵),就是根据关系式,观察前后两个的变化与联系填就好了

为了写着省事用了第一种,但其实它复杂度高,推荐第二种

坑:

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 分块+矩阵快速幂的更多相关文章

  1. HDU 6395 Sequence 【矩阵快速幂 && 暴力】

    任意门:http://acm.hdu.edu.cn/showproblem.php?pid=6395 Sequence Time Limit: 4000/2000 MS (Java/Others)   ...

  2. HDU 5667 Sequence(矩阵快速幂)

    Problem Description Holion August will eat every thing he has found. Now there are many foods,but he ...

  3. HDU 5667 Sequence【矩阵快速幂+费马小定理】

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5667 题意: Lcomyn 是个很厉害的选手,除了喜欢写17kb+的代码题,偶尔还会写数学题.他找到 ...

  4. Sequence( 分块+矩阵快速幂 )

    题目链接 #include<bits/stdc++.h> using namespace std; #define e exp(1) #define pi acos(-1) #define ...

  5. 杭电多校第七场 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 ...

  6. HDU.1575 Tr A ( 矩阵快速幂)

    HDU.1575 Tr A ( 矩阵快速幂) 点我挑战题目 题意分析 直接求矩阵A^K的结果,然后计算正对角线,即左上到右下对角线的和,结果模9973后输出即可. 由于此题矩阵直接给出的,题目比较裸. ...

  7. hdu 3117 Fibonacci Numbers 矩阵快速幂+公式

    斐波那契数列后四位可以用快速幂取模(模10000)算出.前四位要用公式推 HDU 3117 Fibonacci Numbers(矩阵快速幂+公式) f(n)=(((1+√5)/2)^n+((1-√5) ...

  8. HDU - 6395 Sequence (整除分块+矩阵快速幂)

    定义数列: $\left\{\begin{eqnarray*} F_1 &=& A \\ F_2 &=& B \\ F_n &=& C\cdot{}F_ ...

  9. HDU-6395 多校7 Sequence(除法分块+矩阵快速幂)

    Sequence Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)Total ...

随机推荐

  1. 李开复:VC看不上你的五个原因

    [编者按]:此文是李开复先生发表于其LinkedIn主页上的一篇文章,简单列举了五条与VC接触常忽略的经验.如果你是一位正准备和VC谈判取得资金上帮助的创业者,那么应该避免企业家常常犯下的五条错误. ...

  2. 动态加载Dll时,通过Type生成类对象

    原文:动态加载Dll时,通过Type生成类对象 转:http://www.cnblogs.com/zfanlong1314/p/4197383.html "反射"其实就是利用程序集 ...

  3. 人活着系列Tanya和蔡健雅猪 (floyd)

    人活着系列之芳姐和芳姐的猪 Time Limit: 1000MS Memory limit: 65536K 题目描写叙述 芳姐特别喜欢猪,所以,她特意养了m个猪圈,顺便在k条无向边,每条边有都有起点v ...

  4. 线程安全ConcurrentBag

    ConcurrentBag并行,不保证顺序,线程安全 public static void ConcurrentBagWithPallel() { ConcurrentBag<int> l ...

  5. MIME映射(程序映射)

    MIME(Multipurpose Internet Mail Extensions)多用途互联网邮件扩展类型.是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问的时候,浏览器 ...

  6. HTTP协议-请求报文

  7. 【全面解禁!真正的Expression Blend实战开发技巧】第九章 FluidMoveBehavior完全解析之二平滑运动的滚动条

    原文:[全面解禁!真正的Expression Blend实战开发技巧]第九章 FluidMoveBehavior完全解析之二平滑运动的滚动条 这一章讲解FluidMoveBehavior的另一个应用, ...

  8. Windows 10开发基础——XML和JSON (二)

    主要内容: Linq to XML Newtonsoft.Json.Linq来解析JSON 博客园RSS(http://www.cnblogs.com/rss)的解析 UWP调用自己实现的Web AP ...

  9. 欢迎订阅AI科技导读微信公众号,获取人工智能的最新技术解读教程!

    微信扫一扫关注,获取最新AI技术教程!

  10. 一键彻底关闭Win10自带Windows Defender杀毒软件

    1.以管理员身份打开系统的命令提示符[cmd.exe]. 2.输入以下命令: reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\ ...