正解:矩阵快速幂

解题报告:

我永远喜欢loj!

一看到这个就应该能想到矩阵快速幂?

然后就考虑转移式,发现好像直接想不好想,,,主要的问题在于这个*$i$,就很不好搞$QAQ$

其实不难想到,$\sum_{i=1}^{n}a_i\cdot(n-i)$这样一个式子是可以在矩阵快速幂中推出来的(类似这个形式的都可,,,就随着编号递增系数递减这样子$QwQ$

具体来说就是表示成$\sum_{i=1}^{n}\sum_{j=1}^{i}a_j$,就欧克辣(具体实现后面港,,,

但是问题在于,它是$\sum_{i=1}^{n}a_i\cdot i$这样的,就随着编号递增系数递增这样子的$QwQ$

那显然就想到,变形嘛,就变成$\sum_{i=1}^{n}a_i\cdot n-\sum_{i=1}^{n}a_i\cdot(n-i)$这样子

然后就做完辣,,,?

剩下的就是考虑怎么表示出$\sum_{i=1}^{n}a_i$和$\sum_{i=1}^{n}a_i\cdot(n-i)$辣

对于第一个的话,可以考虑$\begin{bmatrix}\sum_{j=1}^{i-1} f_i \\ f_i\\ f_{i-1}\end{bmatrix}$$\cdot$$\begin{bmatrix}1 & 1 & 0\\ 0 & 1 & 1\\ 0 & 1 & 0\end{bmatrix}$,就欧克辣

然后第二个就差不多的方法,再加一维就好,$\begin{bmatrix}\sum _{j=1}^{i-1}\sum_{k=1}^{j}f_k\\ \sum_{j=1}^{i}f_j\\ f_{i+1}\\ f_{i}\end{bmatrix}$$\cdot$$\begin{bmatrix}1 & 1 & 0 & 0\\ 0 & 1 & 1 & 0\\ 0 & 0 & 1 & 1\\0 & 0 & 1 & 0\end{bmatrix}$

欧克做完辣,,,

#include<bits/stdc++.h>
using namespace std;
#define il inline
#define int long long
#define gc getchar()
#define ri register int
#define rb register bool
#define rc register char
#define rp(i,x,y) for(ri i=x;i<=y;++i) int n,mod;
struct matrix{int mat[][];il void clr(){memset(mat,,sizeof(mat));}}e1,e2,fib; il int read()
{
rc ch=gc;ri x=;rb y=;
while(ch!='-' && (ch>'' || ch<''))ch=gc;
if(ch=='-')ch=gc,y=;
while(ch>='' && ch<='')x=(x<<)+(x<<)+(ch^''),ch=gc;
return y?x:-x;
}
il matrix multi(matrix gd,matrix gs)
{
matrix ret;ret.clr();
rp(i,,)
rp(j,,)
rp(k,,)ret.mat[i][j]=(ret.mat[i][j]+gd.mat[i][k]*gs.mat[k][j]%mod)%mod;
return ret;
}
il matrix power_1(ri x)
{matrix ret;ret.clr();ret.mat[][]=;while(x){if(x&)ret=multi(ret,e1);e1=multi(e1,e1);x>>=;}return ret;}
il matrix power_2(ri x)
{matrix ret;ret.clr();ret.mat[][]=;while(x){if(x&)ret=multi(ret,e2);e2=multi(e2,e2);x>>=;}return ret;}
namespace sub1
{
il void main()
{
int fib1=,fib2=,as=;
rp(i,,n){as=(as+1ll*fib1*i%mod)%mod;fib2+=fib1;fib1=fib2-fib1;if(fib2>=mod)fib2-=mod;}
printf("%lld\n",as);
}
} main()
{
// freopen("fib.in","r",stdin);freopen("fib.out","w",stdout);
n=read();mod=read();
// if(n<=100)return sub1::main(),0;
e1.clr();e1.mat[][]=;e1.mat[][]=;e1.mat[][]=;e1.mat[][]=;e1.mat[][]=;
e2.clr();e2.mat[][]=;e2.mat[][]=;e2.mat[][]=;e2.mat[][]=;e2.mat[][]=;e2.mat[][]=;e2.mat[][]=;
matrix as1=power_1(n),as2=power_2(n);
printf("%lld\n",((as1.mat[][]*n%mod-as2.mat[][])%mod+mod)%mod);
return ;
}

最后放下代码就好辣!(跑得飞慢,,,QAQ

upd:

今天交流了下,,,发现我这个方法太呆了$TT$

说个神一点儿的方法

可以发现斐波拉契数列其实有个规律,,,就 $ 1+\sum_{j=1}^{i} f_{j}=f_{i} $ (其实是这个:$\sum_{i=1}^nf_i=f_{n+2}-f_2$

设$s_i=\sum_{j=1}^i$

可以得到,$ans=n\cdot s_n-(s_{1}+s_{2}+...+s_{n-1})$

代入上面那个然后变形一下可得,$ans=n\cdot f_{n+2}-f_{n+3}+n+2$

然后就傻逼题了,懒得放代码辽太$easy$辣$QAQ$

随机推荐

  1. React Native声明属性和属性确认

    属性声明 因为用React Native创建的自定义组件可以复用, 我们开发过程中可能一个项目组有多个人同时开发,其他同事可能会用到我们自定义的组件, 但是他们使用的时候很容易忘记使用某些属性,这时候 ...

  2. 洛谷P1060 开心的金明

    //01背包 价值等于重要度乘体积 #include<bits/stdc++.h> using namespace std; ; ; int n,m,v[maxn],w[maxn],f[m ...

  3. @省选模拟赛03/16 - T3@ 超级树

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 一棵 k-超级树(k-SuperTree) 可按如下方法得到:取 ...

  4. W3C vs IE盒模型

    今年4月份的一次面试,问到盒模型,是我第一次接触到盒模型,但当时不太明白,没有说清楚,后来查了下,但一知半解. 下面分享下,我对盒模型的理解: 盒模型,也就是box-sizing,分为content- ...

  5. windows 怎样关闭redis

    安装redis之后在命令行窗口中输入 redis-server redis.windows.conf 启动redis关闭命令行窗口就是关闭 redis.---redis作为windows服务启动方式r ...

  6. H3C PPP显示与调试

  7. PyTorch里面的torch.nn.Parameter()

    在刷官方Tutorial的时候发现了一个用法self.v = torch.nn.Parameter(torch.FloatTensor(hidden_size)),看了官方教程里面的解释也是云里雾里, ...

  8. Spring Cloud探路(三)REST 客户端Feign

    Declarative REST Client: Feign Feign is a declarative web service client. It makes writing web servi ...

  9. P1102 走迷宫二

    题目描述 大魔王抓住了爱丽丝,将她丢进了一口枯井中,并堵住了井口. 爱丽丝在井底发现了一张地图,他发现他现在身处一个迷宫当中,从地图中可以发现,迷宫是一个N*M的矩形,爱丽丝身处迷宫的左上角,唯一的出 ...

  10. 2018-2-13-win10-uwp-InkCanvas控件数据绑定

    title author date CreateTime categories win10 uwp InkCanvas控件数据绑定 lindexi 2018-2-13 17:23:3 +0800 20 ...