题目传送门

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. sychronized

    说一下 synchronized 底层实现原理? synchronized可以保证方法或者代码块在运行时, 同一时刻只有一个方法可以进入到临界区, 同时它还可以保证共享变量的内存可见性. Java中每 ...

  2. Go语言 判断key是否在map里 if _, ok := map[key]; ok

    if val, ok := map[key]; ok { //do something here } 如果key在map里 val 被赋值map[key] ok 是true 否则val得到相应类型的零 ...

  3. 媒体查询media query

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  4. TDSQL MySQL版基本原理-水平分表 读写分离 弹性扩展 强同步

    TDSQL MySQL版(TDSQL for MySQL)是部署在腾讯云上的一种支持自动水平拆分.Shared Nothing 架构的分布式数据库.TDSQL MySQL版 即业务获取的是完整的逻辑库 ...

  5. 搭建本地yum源出现:mount: 在 /dev/sr0 上找不到媒体

    2021-07-27 在练习环境搭建时,因为是离线环境,故先搭建本地yum源,但是出现了一个往常没有的问题:mount: 在 /dev/sr0 上找不到媒体,参考其他博主的文章得到解决方法. 排查问题 ...

  6. 快速排序(C++)

    快速排序 快速排序是面试中经常问到的排序算法 基本思想:通过一趟排序将待排序记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小, 则可分别对这两部分记录继续进行排序,以达到整个序 ...

  7. Kafka内外网访问

    本文介绍了Kafka内外网访问的设置. kafka的两个配置listeners和advertised.listeners listeners kafka监听的网卡的ip,假设你机器上有两张网卡,内网1 ...

  8. scrapy抓取的页面中文会变成unicode字符串

    不了解编码的,需要先补下:http://www.cnblogs.com/jiangtu/p/6245264.html 在学习&使用scrapy抓取网上信息时,发现scrapy 会将含有中文的f ...

  9. ubuntu下使用minicom

    环境 宿主机平台:Ubuntu 16.04.6 目标机:iMX6ULL 安装及使用 首先时在Ubuntu里安装minicom sudo apt-get install minicom 接下来可以使用 ...

  10. Vue+element基本增删改查

    <!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8&quo ...