[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 ...
随机推荐
- Fiddler教程(Web调试工具)
转载地址:写得很不错的fildder教程 http://kb.cnblogs.com/page/130367/ Fiddler的基本介绍 Fiddler的官方网站: www.fiddler2.c ...
- C/C++ static用法
这篇文章没有太多的实际内容,简单记录下static的用法.顺便试一下用markdown来写文章. 1. 在函数中使用 我们都知道在一个函数中的变量是存储在栈区中,函数的每一次调用都伴随着变量的重新定义 ...
- datacontract helper
public static class DataContractHelper { public static void ToDCFile<T>(this T obj, string pat ...
- Win8Metro(C#)数字图像处理--2.3图像反色
原文:Win8Metro(C#)数字图像处理--2.3图像反色 [函数名称] 图像反色函数ContraryProcess(WriteableBitmap src) [算法说明] 反色公式如下: ...
- “重定向次数过多”或者“Too many automatic redirections were attempted”的错误:
C# 代码 C# code? 1 2 3 4 5 6 7 8 9 String url="http://www.google.com.hk/search?hl=zh-CN&q=孟宪会 ...
- Android零基础入门第11节:简单几步带你飞,运行Android Studio工程
原文:Android零基础入门第11节:简单几步带你飞,运行Android Studio工程 之前讲过Eclipse环境下的Android虚拟设备的创建和使用,现在既然升级了Android Studi ...
- Play Framework 模板里使用注入访问数据层
从Play2.4开始,推荐使用依赖注入替代静态控制器.因此我们不能像play2.3那样,在模板里直接调用object访问数据层.是的,我们还是可以使用常规方式,通过传参到模板里.不过这样很多时候不方便 ...
- 青云QingCloud黄允松:最高效的研发管理就是没有管理
摘要: 对于底层技术创新而言,没有管理是最好的管理,小规模作战,快速试错,迅速转变方向,迭代周期一定要短. 钛媒体注:钛媒体.商业价值联合主办的第五届“MIIC移动互联网创新大会”如期举行.2015 ...
- 预编译加速编译(precompiled_header),指定临时文件生成目录,使项目文件夹更干净(MOC_DIR,RCC_DIR, UI_DIR, OBJECTS_DIR),#pragma execution_character_set("UTF-8")"这个命令是在编译时产生作用的,而不是运行时
预编译加速编译 QT也可以像VS那样使用预编译头文件来加速编译器的编译速度.首先在.pro文件中加入: CONFIG += precompiled_header 然后定义需要预编译的头文件: PREC ...
- 核心思想:想清楚自己创业的目的(如果你没有自信提供一种更好的产品或服务,那就别做了,比如IM 电商 搜索)
这个时代对于学 IT 的人来说是幸运的.一个普通的程序员可以相对轻易地找到工作,可以轻易拿到比其他行业高得多的工资,甚至自己创建世界级的企业亦非空想.马云.马化腾等企业家的成功,似乎时刻提醒人们:即便 ...