【题目链接】

点击打开链接

【算法】

要求

f(g(0)) + f(g(1)) + f(g(2)) + ... + f(g(n-1))

因为g(i) = k * i + b

所以原式 = f(b) + f(k+b) + f(2k+b) + .... + f((n-1)k+b)

令矩阵A = {1,1,0,1}(求斐波那契数的矩阵)

那么,式子就可以写成A^b + A^(k + b) + A ^ (2k + b) + .... + A ^ ((n - 1)k + b)

因为矩阵符合乘法分配律,所以可以将A^b提出,式子被写成 :

A ^ b( E + A ^ k + A ^ 2k + ... + A ^ (n - 1)k ) (其中E为2阶单位阵)

令矩阵S = A ^ k

那么式子就被进一步化简为 : A^b( S^0 + S^1 + S^2 + .. + S^(n-1) )

A^b可以通过矩阵乘法快速幂求出

而后面的S^0 + S^1 + S ^ 2 + ... S^(n-1)则可以通过二分求解(也就是POJ 3233的方法)

【代码】

#include<bits/stdc++.h>
using namespace std; int n,b,k,m;
struct Matrix
{
long long mat[][];
} A,E,ans,s; inline Matrix mul(Matrix a,Matrix b)
{
int i,j,k;
Matrix ans;
memset(ans.mat,,sizeof(ans.mat));
for (i = ; i <= ; i++)
{
for (j = ; j <= ; j++)
{
for (k = ; k <= ; k++)
{
ans.mat[i][j] = (ans.mat[i][j] + a.mat[i][k] * b.mat[k][j]) % m;
}
}
}
return ans;
}
inline Matrix add(Matrix a,Matrix b)
{
int i,j;
Matrix ans;
memset(ans.mat,,sizeof(ans.mat));
for (i = ; i <= ; i++)
{
for (j = ; j <= ; j++)
{
ans.mat[i][j] = (a.mat[i][j] + b.mat[i][j]) % m;
}
}
return ans;
}
inline Matrix power(Matrix a,int n)
{
int i,j;
Matrix ans,p = a;
for (i = ; i <= ; i++)
{
for (j = ; j <= ; j++)
{
ans.mat[i][j] = (i == j);
}
}
while (n > )
{
if (n & ) ans = mul(ans,p);
p = mul(p,p);
n >>= ;
}
return ans;
}
inline Matrix solve(Matrix a,int n)
{
Matrix tmp;
if (n == ) return a;
if (n % == ) return add(solve(a,n-),power(a,n));
else
{
tmp = solve(a,n/);
return add(tmp,mul(power(a,n/),tmp));
}
} int main() { E.mat[][] = ; E.mat[][] = ;
E.mat[][] = E.mat[][] = ;
while (scanf("%d%d%d%d",&k,&b,&n,&m) != EOF)
{
A.mat[][] = A.mat[][] = A.mat[][] = ;
A.mat[][] = ;
s = power(A,k);
ans = mul(power(A,b),add(E,solve(s,n-)));
printf("%lld\n",ans.mat[][]);
} return ; }

最新文章

  1. stanford corenlp的TokensRegex
  2. git 实用技巧
  3. js验证输入的金钱格式
  4. mysql-模拟全连接处理
  5. 【caffe】loss function、cost function和error
  6. HttpClient 3.X 4.3 4.x超时设置
  7. 阿里公共DNS 正式发布了
  8. 17、Map接口及其常用子类(Hashtable、HashMap、WeakHashMap)
  9. 使用storm分别进行计数和词频统计
  10. C/C++内存布局及对齐
  11. Java基础知识_毕向东_Java基础视频教程笔记(11-12 多线程)
  12. pThreads线程(二) 线程同步--互斥量/锁
  13. 使用 dl 设计的简单的登陆界面 (为了记录)
  14. 解决Linux关闭SSH,终端后运行程序终止问题(包括后台)
  15. Backbone学习总结
  16. 腾讯的网站是如何检测到你的 QQ 已经登录?
  17. BitTorrent Sync 老版本
  18. java网络编程三次握手四次挥手
  19. 树形DP--codevs 1380 没有上司的舞会
  20. sqlplus column命令用法

热门文章

  1. 简述站点访问控制、基于用户的访问控制、httpd虚拟主机、持久链接等应用配置实例
  2. layuiAdmin 项目修改
  3. super在python中有什么用
  4. 第一节:python提取PDF文档中的图片
  5. 04003_CSS
  6. CodeForces - 425E Sereja and Sets 题解
  7. hihoCoder#1042 跑马圈地
  8. 元祖、hash了解、字典、集合
  9. HDU 2222 (AC自动机)
  10. 修改phpMyAdmin导入SQL文件的大小限制