【HDU 1588】 Gauss Fibonacci
【题目链接】
【算法】
要求
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 ; }
【HDU 1588】 Gauss Fibonacci的更多相关文章
- -【线性基】【BZOJ 2460】【BZOJ 2115】【HDU 3949】
		[把三道我做过的线性基题目放在一起总结一下,代码都挺简单,主要就是贪心思想和异或的高斯消元] [然后把网上的讲解归纳一下] 1.线性基: 若干数的线性基是一组数a1,a2,a3...an,其中ax的最 ... 
- 【数位dp】【HDU 3555】【HDU 2089】数位DP入门题
		[HDU 3555]原题直通车: 代码: // 31MS 900K 909 B G++ #include<iostream> #include<cstdio> #includ ... 
- 【HDU 5647】DZY Loves Connecting(树DP)
		pid=5647">[HDU 5647]DZY Loves Connecting(树DP) DZY Loves Connecting Time Limit: 4000/2000 MS ... 
- 【HDU 2196】 Computer(树的直径)
		[HDU 2196] Computer(树的直径) 题链http://acm.hdu.edu.cn/showproblem.php?pid=2196 这题可以用树形DP解决,自然也可以用最直观的方法解 ... 
- 【HDU 2196】 Computer (树形DP)
		[HDU 2196] Computer 题链http://acm.hdu.edu.cn/showproblem.php?pid=2196 刘汝佳<算法竞赛入门经典>P282页留下了这个问题 ... 
- 【HDU 5145】 NPY and girls(组合+莫队)
		pid=5145">[HDU 5145] NPY and girls(组合+莫队) NPY and girls Time Limit: 8000/4000 MS (Java/Other ... 
- 【hdu 1848】Fibonacci again and again
		Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s) ... 
- 【hdu 1043】Eight
		[题目链接]:http://acm.hdu.edu.cn/showproblem.php?pid=1043 [题意] 会给你很多组数据; 让你输出这组数据到目标状态的具体步骤; [题解] 从12345 ... 
- 【HDU 3068】 最长回文
		[题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=3068 [算法] Manacher算法求最长回文子串 [代码] #include<bits/s ... 
随机推荐
- [Python3网络爬虫开发实战] 3.1.1-发送请求
			使用urllib的request模块,我们可以方便地实现请求的发送并得到响应,本节就来看下它的具体用法. 1. urlopen() urllib.request模块提供了最基本的构造HTTP请求的方法 ... 
- 树莓派 -- 输入设备驱动 (key) 续2:  转载 Setting up a GPIO-Button “keyboard” on a Raspberry Pi
			使用device-tree (DT) overlay应该是更方便的方法: http://blog.gegg.us/2017/01/setting-up-a-gpio-button-keyboard-o ... 
- ubuntu  lamnp 环境的安装/卸载 及 配置
			安装mysql--------------------------------------sudo apt install mysql-server #5.7版本 安装php----------- ... 
- 【Python实践-10】用sorted()对列表排序
			#按名字排序 l2= [('Bob', 75), ('Adam', 92), ('Bart', 66), ('Lisa', 88)] def by_name(t): return t[0] l2=so ... 
- python flask获取微信用户信息报404,nginx问题
			在学习flask与微信公众号时问题,发现测试自动回复/wechat8008时正常,而测试获取微信用户信息/wechat8008/index时出现404.查询资料后收发是nginx配置问题. 在loca ... 
- N分之一 竖式除法模拟
			N分之一 Description Alice越来越痴迷于数学问题了.一天,爸爸出了个数学题想难倒她,让她求1 / n. 可怜的Alice只有一岁零九个月,回答不上来 ~~~~(>_<)~~ ... 
- CF601D:Acyclic Organic Compounds
			给n<=300000的树,每个点上有一个字母,一个点的权值为:从该点出发向下走到任意节点停下形成的不同字符串的数量,问最大权值. 题目本身还有一些奇怪要求在此忽略.. Trie合并的模板题. # ... 
- Memory Ordering in Modern Microprocessors
			Linux has supported a large number of SMP systems based on a variety of CPUs since the 2.0 kernel. L ... 
- Oracle中,利用sql语句中的函数实现保留两位小数和四舍五入保留两位小数
			Oracle中,利用sql语句中的函数实现保留两位小数和四舍五入保留两位小数: select trunc(1.23856789,2) from dual round(m,n) 可以四舍五入 trunc ... 
- UUID使用
			import java.util.UUID; public static String getUUID() { UUID uuid =UUID.randomUUID(); String str = u ... 
