题目传送门

Description

给出 \(n,k\) ,求出:

\[\sum_{i=1}^{n} f_i·i^k
\]

其中 \(f_i\) 表示斐波拉契第 \(i\) 项。\(n\le 10^{18},k\le 40\) 。

Solution

哎,被这个 \(k\le 40\) 误导了,以为是斯特林数。/kk

发现假如我们用矩阵表示 \(f_i\),那么我们就只需要求出:

\[\sum_{i=1}^{n} G^ii^k
\]

其中 \(G=\begin{bmatrix}1 & 1\\ 1 & 0\end{bmatrix}\) 。

考虑倍增,设 \(f(n,m)=\sum_{i=1}^{n} G^ii^m\),则有:

\[f(2n,m)=f(n,m)+G^n\sum_{h=0}^{m} n^h\binom{m}{h}f(n,m-h)
\]

然后我们就可以做到 \(\Theta(k^2\log n)\) 了,不过似乎分治的时候用 \(\text{fft}\) 的话可以做到 \(\Theta(k\log k\log n)\),不过这个题中 \(k\) 不是很大,所以可以接受。

(矩阵的 \(\text{fwt}\) 可以对于每一项搞)

Code

#include <bits/stdc++.h>
using namespace std; #define Int register int
#define mod 1000000007
#define int long long
#define MAXN 45 template <typename T> inline void read (T &t){t = 0;char c = getchar();int f = 1;while (c < '0' || c > '9'){if (c == '-') f = -f;c = getchar();}while (c >= '0' && c <= '9'){t = (t << 3) + (t << 1) + c - '0';c = getchar();} t *= f;}
template <typename T,typename ... Args> inline void read (T &t,Args&... args){read (t);read (args...);}
template <typename T> inline void write (T x){if (x < 0){x = -x;putchar ('-');}if (x > 9) write (x / 10);putchar (x % 10 + '0');}
template <typename T> inline void chkmax (T &a,T b){a = max (a,b);}
template <typename T> inline void chkmin (T &a,T b){a = min (a,b);} int k,C[MAXN][MAXN];
int mul (int a,int b){return 1ll * a * b % mod;}
int dec (int a,int b){return a >= b ? a - b : a + mod - b;}
int add (int a,int b){return a + b >= mod ? a + b - mod : a + b;}
void Add (int &a,int b){a = add (a,b);}
void Sub (int &a,int b){a = dec (a,b);} struct matrix{
int mat[2][2];
matrix(){memset (mat,0,sizeof (mat));}
int * operator [] (const int key){return mat[key];}
matrix operator * (const matrix &p)const{
matrix now;
for (Int i = 0;i < 2;++ i)
for (Int j = 0;j < 2;++ j)
for (Int k = 0;k < 2;++ k)
Add (now.mat[i][k],mul (mat[i][j],p.mat[j][k]));
return now;
}
matrix operator * (const int &p)const{
matrix now;
for (Int i = 0;i < 2;++ i)
for (Int j = 0;j < 2;++ j)
now.mat[i][j] = mul (mat[i][j],p);
return now;
}
matrix operator + (const matrix &p)const{
matrix now;
for (Int i = 0;i < 2;++ i)
for (Int j = 0;j < 2;++ j)
now.mat[i][j] = add (mat[i][j],p.mat[i][j]);
return now;
}
}one,ret; struct node{
matrix gn,f[MAXN];
}; node getit (int n){
node now;
if (n == 1){
now.gn = ret;
for (Int i = 0;i <= k;++ i) now.f[i] = ret;
return now;
}
if (n & 1){
node lst = getit (n - 1);
now.gn = lst.gn * ret;
for (Int i = 0,res = 1;i <= k;++ i,res = mul (res,n % mod)) now.f[i] = lst.f[i] + now.gn * res;
}
else{
int mid = n >> 1;
node lst = getit (mid);now.gn = lst.gn * lst.gn;
for (Int m = 0;m <= k;++ m){
now.f[m] = lst.f[m];
for (Int h = 0,res = 1;h <= m;++ h,res = mul (res,mid % mod)) now.f[m] = now.f[m] + (lst.gn * lst.f[m - h]) * mul (res,C[m][h]);
}
}
return now;
} int n; signed main(){
read (n,k),one[0][0] = one[1][1] = 1,ret[0][0] = ret[0][1] = ret[1][0] = C[0][0] = 1;
for (Int i = 1;i <= k;++ i){
C[i][0] = 1;
for (Int j = 1;j <= i;++ j) C[i][j] = add (C[i - 1][j - 1],C[i - 1][j]);
}
node now = getit (n);
write (now.f[k][0][0]),putchar ('\n');
return 0;
}

题解 Yet Another Number Sequence的更多相关文章

  1. HDU 1711 Number Sequence(数列)

    HDU 1711 Number Sequence(数列) Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Ja ...

  2. HDU 1005 Number Sequence(数列)

    HDU 1005 Number Sequence(数列) Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Jav ...

  3. Number Sequence (HDoj1005)

    Problem Description A number sequence is defined as follows: f(1) = 1, f(2) = 1, f(n) = (A * f(n - 1 ...

  4. Number Sequence(kmp)

        Number Sequence Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Oth ...

  5. Number Sequence(周期是336!!不是48!!)

    1005 Number Sequence 时间限制: 1 Sec  内存限制: 60 MB 题目描述 A number sequence is defined as follows: f(1) = 1 ...

  6. Spring-1-H Number Sequence(HDU 5014)解题报告及测试数据

    Number Sequence Time Limit:2000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Pro ...

  7. Winter-1-F Number Sequence 解题报告及测试数据

    Time Limit:1000MS     Memory Limit:32768KB Description ​A number sequence is defined as follows:f(1) ...

  8. Poj 1019 Number Sequence( 数据分析和操作)

    一.题目大意 有这样一个序列包含S1,S2,S3...SK,每一个Si包括整数1到 i.求在这个序列中给定的整数n为下标的数. 例如,前80位为1121231234123451234561234567 ...

  9. CodeForces - 393E Yet Another Number Sequence

    Discription Everyone knows what the Fibonacci sequence is. This sequence can be defined by the recur ...

随机推荐

  1. Linkerd 2.10(Step by Step)—控制平面调试端点

    Linkerd 2.10 系列 快速上手 Linkerd v2 Service Mesh(服务网格) 腾讯云 K8S 集群实战 Service Mesh-Linkerd2 & Traefik2 ...

  2. php 字符串分割输出

    分割字符串 //利用 explode 函数分割字符串到数组 复制代码代码如下:<?php $source = "hello1,hello2,hello3,hello4,hello5&q ...

  3. Qt5完美解决 界面显示中文乱码

    最近在学习Qt,可是一直头疼于中文乱码问题,上网搜了一下,很多都是Qt4中使用如下方法: QTextCodec *codec = QTextCodec::codecForName("gbk& ...

  4. PyPDF2.py 合并pdf时报错问题

    报错如下: Traceback (most recent call last): File "./pdf_merge.py", line 68, in <module> ...

  5. HCNP Routing&Switching之OSPF LSA更新规则和路由汇总

    前文我们了解了OSPF外部路由类型以及forwarding address字段的作用,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/15225673.html: ...

  6. CGLib 简析

    背景 JDK 动态代理存在的一些问题: 调用效率低 JDK 通过反射实现动态代理调用,这意味着低下的调用效率: 每次调用 Method.invoke() 都会检查方法的可见性.校验参数是否匹配,过程涉 ...

  7. Linux内核学习之工作队列

    Author       : Toney Email         : vip_13031075266@163.com Date          : 2020.12.02 Copyright : ...

  8. Linux高级之语句表达式

    表达式 表达式和语句是 C 语言中的基础概念.什么是表达式呢?表达式就是由一系列操作符和操作数构成的式子.操作符可以是 C 语言标准规定的各种算术运算符.逻辑运算符.赋值运算符.比较运算符等.操作数可 ...

  9. 虚拟机使用scp传输文件提示“WARNING REMOTE HOST IDENTIFICATION HAS CHANGED”解决方式

    虚拟机使用scp传输文件提示"WARNING REMOTE HOST IDENTIFICATION HAS CHANGED"解决方式 简单的说就是虚拟机里保存的认证密钥不正确了,需 ...

  10. golang sync.noCopy 类型 —— 初探 copylocks 与 empty struct

    问题引入 学习golang(v1.16)的 WaitGroup 代码时,看到了一处奇怪的用法,见下方类型定义: type WaitGroup struct { noCopy noCopy ... } ...