HDU - 6395:Sequence (分块+矩阵)
2024-08-25 06:37:45
题面太丑了,就不复制了。
题意:F1=A; F2=B; Fn=D*Fn-1+C*Fn-2+P/i;求Fn。
思路:根据P/i的值划分区间,每个区间矩阵求。
带常数的矩阵:
#include<bits/stdc++.h>
#define ll long long
#define rep(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
const int Mod=1e9+;
struct mat
{
int mp[][];
mat(){memset(mp,,sizeof(mp)); }
mat friend operator *(mat a,mat b)
{
mat res;
rep(k,,) rep(i,,) rep(j,,)
res.mp[i][j]=(res.mp[i][j]+((ll)a.mp[i][k]*b.mp[k][j]%Mod))%Mod;
return res;
}
mat friend operator ^(mat a,int x)
{
mat res;
rep(i,,) res.mp[i][i]=;
while(x){
if(x&) res=res*a; a=a*a; x>>=;
}return res;
}
}; int main()
{
int T,N,A,B,C,D,P,fcy;
scanf("%d",&T);
while(T--){
scanf("%d%d%d%d%d%d",&A,&B,&C,&D,&P,&N);
if(N==) {printf("%d",A); continue;}
if(N==) {printf("%d",B); continue;}
for(int i=,r;i<=N;i=r+){
int tmp=P/i;
if(tmp==) r=N;
else r=min(P/(P/i),N);
mat ans,base;
ans.mp[][]=B;ans.mp[][]=A; ans.mp[][]=;
base.mp[][]=D; base.mp[][]=C; base.mp[][]=tmp;
base.mp[][]=base.mp[][]=;
ans=(base^(r-i+))*ans;
if(r==N) fcy=ans.mp[][];
else B=ans.mp[][],A=ans.mp[][];
}
printf("%d\n",fcy);
}
return ;
}
最新文章
- xampp 端口冲突
- react参考项目001
- HDU 1005 F(Contest #1)
- 建立mvc过程
- WinForm------GridControl右键添加动态菜单
- 计数排序 + 线段树优化 --- Codeforces 558E : A Simple Task
- spring事务失效
- CopyU!下一次更新将增加对设备厂商及型号的识别!
- Junit 源码剖析(一)
- MySQL重置root密码的几种方法(windows+Linux)
- wordpress主题制作结构文件
- 算法:1!+(1!+3!)+(1!+3!+5!) + ( 1! + 3! + 5! + 7! + 9!)+....+(1!+3!+5!+ ... + m!)
- linux系统命令学习系列-用户切换命令su,sudo
- 数据文件实时同步(rsync + sersync2)
- springboot整合mybatis和mybatis-plus
- 常用基础Linux操作命令总结与hadoop基础操作命令
- Spring根据包名获取包路径下的所有类
- 阿里云服务器Centos7.4开放80端口的记录
- Codeforces Round #481 (Div. 3)题解
- DOM LEVEL 1 中的那些事儿[总结篇-上]