Tyche 2191 WYF的递推式
题目描述
WYF手中有这样一条递推式
WYF并不是想让你帮他做出结果,事实上,给定一个n,他能够迅速算出Fn。WYF只是想单纯的考验一下读者们。
仅一行,三个整数N,F1,P
仅一行,表示Fn模P的余数。
5 1 100
41
对20%的数据,N≤1000。
对50%的数据,N≤10000000。
对100%的数据,N、F1≤1018,P≤109
解题思路
N<=1e18,最后的复杂度应该是O(1)或者O(lg(N))
直接模拟式o(N^2)的,显然不行,虽然可以骗到20分。
考虑累加中每一项之前都乘了n^2,可以算一下f(n+1)-f(n)
F(n)=F(n-1)+(n-1)∑(k=1) (n-k)*F(k)(n>=3)
每一个f之前都乘了n,所以考虑再减一下
F(n)=2*F(n-1)-F(n-2)+(n-1)∑(k=1)F(k) (n>=4)
那如果再减一下,是不是就没有∑了,于是我又减了一下
F(n)=4*F(n-1)-3*F(n-2)+F(n-3) (n>=5)
看到这个样子就很舒服了,明显矩阵快速幂,但是我手残,总是忘记longlong越界之类的问题,调了一下午,终于过了。
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
long long n,p,t;
struct mat
{
long long a[][];
mat()
{
memset(a,,sizeof(a));
}
mat operator * (mat x)
{
mat ans;
for(int i=;i<=;i++)
for(int j=;j<=;j++)
for(int k=;k<=;k++)
ans.a[i][j]+=a[i][k]*x.a[k][j],ans.a[i][j]=(ans.a[i][j]+p)%p;
return ans;
}
}f,chg;
mat mul(mat x,long long k)
{
mat res;
res.a[][]=res.a[][]=res.a[][]=;
for(long long i=k;i;i>>=,x=x*x)
if(i&)
res=res*x;
return res;
}
int main()
{
scanf("%lld%lld%lld",&n,&t,&p);
if(n==||n==)
printf("%lld\n",t%p);
else if(n==)
printf("%lld\n",(*t)%p);
else if(n==)
printf("%lld\n",(*(t%p))%p);
else
{
f.a[][]=(*(t%p))%p,f.a[][]=(*t)%p,f.a[][]=t%p;
chg.a[][]=,chg.a[][]=,chg.a[][]=,chg.a[][]=-,chg.a[][]=,chg.a[][]=,chg.a[][]=,chg.a[][]=,chg.a[][]=;
chg=mul(chg,n-);
f=f*chg;
printf("%lld\n",f.a[][]);
}
return ;
}
Tyche 2191 WYF的递推式的更多相关文章
- 矩阵乘法&矩阵快速幂&矩阵快速幂解决线性递推式
矩阵乘法,顾名思义矩阵与矩阵相乘, 两矩阵可相乘的前提:第一个矩阵的行与第二个矩阵的列相等 相乘原则: a b * A B = a*A+b*C a*c+b*D c d ...
- P1067Warcraft III 守望者的烦恼(十大矩阵问题之七求递推式)
https://vijos.org/p/1067 守望者-warden,长期在暗夜精灵的的首都艾萨琳内担任视察监狱的任务,监狱是成长条行的,守望者warden拥有一个技能名叫“闪烁”,这个技能可以把她 ...
- hdu 1757 A Simple Math Problem (构造矩阵解决递推式问题)
题意:有一个递推式f(x) 当 x < 10 f(x) = x.当 x >= 10 f(x) = a0 * f(x-1) + a1 * f(x-2) + a2 * f(x-3) + ...
- HDU - 2604 Queuing(递推式+矩阵快速幂)
Queuing Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Su ...
- 【模板】BM + CH(线性递推式的求解,常系数齐次线性递推)
这里所有的内容都将有关于一个线性递推: $f_{n} = \sum\limits_{i = 1}^{k} a_{i} * f_{n - i}$,其中$f_{0}, f_{1}, ... , f_{k ...
- 一只青蛙从第一级台阶跳到第n级,每次可以跳任意级,共有多少种跳法,并写出递推式
是斐波那契数列问题 假设f(n)是n个台阶跳的次数:(假设已经调到第n个台阶,最后一次是由哪个台阶跳上来的) f(n) = f(n-1)+f(n-2)+...+f(n-(n-1)) + f(n-n) ...
- 51nod1149 Pi的递推式
基准时间限制:1 秒 空间限制:131072 KB 分值: 640 F(x) = 1 (0 <= x < 4) F(x) = F(x - 1) + F(x - pi) (4 <= x ...
- HDU 1757 A Simple Math Problem 【矩阵经典7 构造矩阵递推式】
任意门:http://acm.hdu.edu.cn/showproblem.php?pid=1757 A Simple Math Problem Time Limit: 3000/1000 MS (J ...
- 【poj3420】递推式转矩阵乘法
历史性的时刻!!! 推了一晚上!和hyc一起萌萌哒地推出来了!! 被摧残蹂躏的智商啊!!! 然而炒鸡高兴!! (请不要介意蒟蒻的内心独白..) 设a[i]为扫到第i行时的方案数. 易知,对于一行1*4 ...
随机推荐
- vue引入css的两种方式
方案1.在main.js中引入方式 import '@/assets/css/reset.css' 方案2.在.vue文件的<style/>标签里面引入 @import &qu ...
- lambda从入门到精通
JDK8中包含了许多内建的Java中常用到函数接口,比如Comparator或者Runnable接口,这些接口都增加了@FunctionalInterface注解以便能用在lambda上. name ...
- 我们都被GitHub出卖了!逃跑吧兄弟!
周一突然间爆出微软以75亿收购GitHub可真是一颗重磅炸弹,一下轰动整个软件业.如果你不是搞开发的这篇文章几本不会引起你的共鸣:如果你没有用源代码管理这个消息也只不过是个新闻:如果你是微软系的朋友那 ...
- github/gitlab同时管理多个ssh key
之前一直用github,但是github有一个不好的地方,要是创建私有的项目的话需要付费,而gitlab上则可以免费创建管理私有的项目.由于最近想把自己论文的一些东西整理一下,很多东西还是不方便公开, ...
- public private protected default小结
public:可以被所有其他类所访问: private:只能被自己访问和修改: protected:自身.子类及同一个包中类可以访问: default:声明时没有加修饰符,同一包中的类可以访问:当子类 ...
- Python—闭包
闭包的定义:即函数定义和函数表达式位于另一个函数的函数体内(嵌套函数).而且,这些内部函数可以访问它们所在的外部函数中声明的所有局部变量.参数.当其中一个这样的内部函数在包含它们的外部函数之外被调用时 ...
- Python学习第十一篇——for 的本质及如何正确修改列表
假如现在有一个列表:magicians_list = ['mole','jack','lucy'],现在想通过一个函数来实现,在列表的每个元素前面加上“the Great”的字样.现在通过一个函数来实 ...
- myeclipse使用hibernate5框架load延迟装载对象报错_$$_javassist_0 cannot be cast to javassist.util.proxy.Proxy
jar包问题,将hibernate-core-5.0.12.Final.jar删除,换为hibernate-core-4.2.3.final.jar搞定.注意项目运行过后可能删不掉jar包,只需关闭m ...
- 行政区划sql数据脚本
行政区划sql数据脚本 IF (EXISTS(SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[TB_Province]') ...
- Dapper.NET
关于Dapper.NET的相关论述 年少时,为何不为自己的梦想去拼搏一次呢?纵使头破血流,也不悔有那年少轻狂.感慨很多,最近事情也很多,博客也很少更新了,毕竟每个人都需要为自己的生活去努力. 最近 ...