正解:dp

解题报告:

  传送门

  首先可以先拆下这个贡献式,为了方便之后设状态什么的,把式子转成和ny有关,就成了

  \(\sum \left ( n-i \right )^{a}\cdot i^{b}\)

  然后拆下式子化简下,就可以得到

  \(\sum \binom{a}{i}\cdot n^{i}\cdot \left ( -1 \right )^{a-i}\cdot y^{a+b-i}\)

  所以现在就只要能预处理出\(y^{a+b-i}\)就能\(O\left ( n \right )\)得求出来辣!

  所以考虑设dp式\(f[i][j]\)填到了第\(i\)位的时候特征值的\(j\)次方的贡献

  \(umm\)感觉表示得不太清,,,再瞎解释下这个所谓的"特征值的\(j\)次方的贡献",其实指的就这个\(y^{a+b-i}\),然后此处的\(j\)指的就\(a+b-i\)

  然后因为j不能相邻所以考虑加一维\([0/1]:\)最后一位是\(0\)还是\(1\)

  然后转移的话就直接枚第i位填\(01\)就欧克鸭,写下转移式趴QwQ

  \(f[i][j][0]=f[i-1][j][0]+f[i-1][j][1]\)

  \(f[i][j][1]=∑\binom{j}{k}\cdot f[i-1][k][0]\)

  关于\(1\)这个,瞎解释下趴,就,拆下式子嘛,因为填1就相当于\(y^{j}\)成了\(y^{j+1}\)

  拆一下做个差得贡献为\(\sum \binom{i}{j}\cdot y^{j-i}\)

  矩阵加速就好,,,随便讲下矩阵怎么构造的趴,,,

  首先显然想到把矩阵分成两块儿嘛,就直接上半边全放\(f[i][j][0]\)下半边\(f[i][j][1]\)行趴

  然后因为\(f[i][j][0]=f[i-1][j][0]+f[i-1][j][1]\),\(so\)转移矩阵就会是大概这样儿:

  \begin{bmatrix}\ 1\ 0\ 0\ ...\ ...\ 1\ 0\ 0\ ...\ ...\end{bmatrix}

  那对于\(f[i][j][1]=∑\binom{j}{k}\cdot f[i-1][k][0]\),也不难想到转移矩阵大概就这样儿的:

  \begin{bmatrix}\ \binom{i}{0}\ \binom{i}{1}\ \binom{i}{2}\ \binom{i}{3}\ ...\ \binom{i}{i}\ 0\ 0\ ...\ ...\end{bmatrix}

  综上,这题就做完辣\(QwQ\)(,,,这可能是我写过的最久的一篇博客辽,,,\(markdown\)虽然真滴很好看但也真滴很耗时间啊,,,\(awsl\),,,\(QAQ\)

  

#include<bits/stdc++.h>
using namespace std;
#define il inline
#define gc getchar()
#define ri register int
#define rc register char
#define rb register bool
#define rp(i,x,y) for(ri i=x;i<=y;++i)
#define my(i,x,y) for(ri i=x;i>=y;--i) const int N=200+10,M=50+10;
int n,a,b,mod,C[N][N],poww[N],as,m;
struct matrix
{
int s[N][N];
void clear(){memset(s,0,sizeof(s));}
void pre(){clear();rp(i,0,m-1)s[i][i]=1;}
int *operator[](int x){return s[x];}
}G; il int read()
{
rc ch=gc;ri x=0;rb y=1;
while(ch!='-' && (ch>'9' || ch<'0'))ch=gc;
if(ch=='-')ch=gc,y=0;
while(ch>='0' && ch<='9')x=(x<<1)+(x<<3)+(ch^'0'),ch=gc;
return y?x:-x;
}
il int ad(ri x,ri y){x+=y;if(x>=mod)x-=mod;return x;}
il int power(ri x,ri y){ri ret=1;while(y){if(y&1)ret=1ll*ret*x%mod;x=1ll*x*x%mod;y>>=1;}return ret;}
il void pre(ri d)
{
rp(i,0,d)C[i][0]=1;
rp(i,1,d)
rp(j,1,i)C[i][j]=ad(C[i-1][j],C[i-1][j-1]);
poww[0]=1;
rp(i,1,d)poww[i]=1ll*poww[i-1]*n%mod;
}
matrix operator*(matrix &a,matrix &b)
{
matrix ret;ret.clear();
rp(i,0,m-1)
rp(k,0,m-1)
if(a[i][k])
rp(j,0,m-1)
ret[i][j]=ad(ret[i][j],1ll*a[i][k]*b[k][j]%mod);
return ret;
}
matrix m_power(matrix x,ri y)
{
matrix ret;ret.clear();ret[0][0]=1;
while(y){if(y&1)ret=ret*x;x=x*x;y>>=1;}
return ret;
} int main()
{
n=read();a=read();b=read();mod=read();ri l=a+b+1;m=l<<1;pre(a+b+1);
rp(i,0,a+b)
{
G[i+l][i]=G[i][i]=1;
rp(j,0,i)G[j][i+l]=C[i][j];
}
matrix A=m_power(G,n);
for(ri i=0,d=(a&1)?mod-1:1;i<=a;++i,d=mod-d)
as=ad(as,1ll*C[a][i]*d%mod*(A[0][a+b-i]+A[0][a+b-i+l])%mod*poww[i]%mod);
printf("%d\n",as);
return 0;
}

  啊对了这题有点卡常,,,所以说说卡常小技巧趴,,,\(QAQ\)

  \(eg:\)求组合数\(C\)

    这个地方是真的挺坑,,,就应该挺多人求\(C\)会是预处理一个阶乘一个逆元那样子?

    但是这儿有个问题,就这样处理的时候要%很多次,,,\(so\)速度会比较卡,,,所以检验预处理\(C\),这道题是开得下的\(QwQ\)

  \(umm\)其实我就优化了这儿,,,也别的卡常了就只写下这个趴\(QAQ\)

洛谷P4456 交错序列[CQOI2018] dp+数论的更多相关文章

  1. 洛谷P1108 低价购买[DP | LIS方案数]

    题目描述 “低价购买”这条建议是在奶牛股票市场取得成功的一半规则.要想被认为是伟大的投资者,你必须遵循以下的问题建议:“低价购买:再低价购买”.每次你购买一支股票,你必须用低于你上次购买它的价格购买它 ...

  2. NOIP2017提高组Day2T2 宝藏 洛谷P3959 状压dp

    原文链接https://www.cnblogs.com/zhouzhendong/p/9261079.html 题目传送门 - 洛谷P3959 题目传送门 - Vijos P2032 题意 给定一个 ...

  3. 洛谷P1244 青蛙过河 DP/思路

    又是一道奇奇怪怪的DP(其实是思路题). 原文戳>>https://www.luogu.org/problem/show?pid=1244<< 这题的意思给的挺模糊,需要一定的 ...

  4. 洛谷P3928 Sequence2(dp,线段树)

    题目链接: 洛谷 题目大意在描述底下有.此处不赘述. 明显是个类似于LIS的dp. 令 $dp[i][j]$ 表示: $j=1$ 时表示已经处理了 $i$ 个数,上一个选的数来自序列 $A[0]$ 的 ...

  5. 洛谷P1140 相似基因 (DP)

    洛谷P1140 相似基因 题目背景 大家都知道,基因可以看作一个碱基对序列.它包含了44种核苷酸,简记作A,C,G,TA,C,G,T.生物学家正致力于寻找人类基因的功能,以利用于诊断疾病和发明药物. ...

  6. 洛谷P2224 [HNOI2001] 产品加工 [DP补完计划,背包]

    题目传送门 产品加工 题目描述 某加工厂有A.B两台机器,来加工的产品可以由其中任何一台机器完成,或者两台机器共同完成.由于受到机器性能和产品特性的限制,不同的机器加工同一产品所需的时间会不同,若同时 ...

  7. 洛谷1417 烹调方案 dp 贪心

    洛谷 1417 dp 传送门 挺有趣的一道dp题目,看上去接近于0/1背包,但是考虑到取每个点时间不同会对最后结果产生影响,因此需要进行预处理 对于物品x和物品y,当时间为p时,先加x后加y的收益为 ...

  8. 洛谷1387 二维dp 不是特别简略的题解 智商题

    洛谷1387 dp题目,刚开始写的时候使用了前缀和加搜索,复杂度大概在O(n ^ 3)级别,感觉这么写还是比较对得起普及/提高-的难度的..后来看了题解区各位大神的题解,开始一脸mb,之后备受启发. ...

  9. 洛谷 P2657 (数位DP)

    ### 洛谷 P2657 题目链接 ### 题目大意:给你一个数的范围 [A,B] ,问你这段区间内,有几个数满足如下条件: 1.两个相邻数位上的数的差值至少为 2 . 2.不包含前导零. 很简单的数 ...

随机推荐

  1. Filebeat工作原理

    在这篇文章中,您可以了解Filebeat的关键构建模块以及它们如何一起工作.了解这些概念将有助于您针对特定用例对Filebeat进行配置做出明智的决定.Filebeat由两个主要组件组成: prosp ...

  2. PYTHON-模块 re subprocess

    # re 正则表达式 ****** 学符号 单字符 范围 重复 位置 分组 精准 写不出来百度去# http://www.cnblogs.com/Eva-J/articles/7228075.html ...

  3. hdu3652 数位dp记忆化搜索

    从未见过的船新版本数位dp,,省去了预处理过程,直接进行计算 #include<bits/stdc++.h> using namespace std; #define ll long lo ...

  4. element ui table单选框点击全选问题

    <template slot-scope="scope"> <el-radio-group v-model="scope.row.HandleState ...

  5. 蓝桥杯 倍数问题(dfs,枚举组合数)

    标题:倍数问题 [题目描述]众所周知,小葱同学擅长计算,尤其擅长计算一个数是否是另外一个数的倍数.但小葱只擅长两个数的情况,当有很多个数之后就会比较苦恼.现在小葱给了你 n 个数,希望你从这 n 个数 ...

  6. Yarn集群的搭建、Yarn的架构和WordCount程序在集群提交方式

    一.Yarn集群概述及搭建 1.Mapreduce程序运行在多台机器的集群上,而且在运行是要使用很多maptask和reducertask,这个过程中需要一个自动化任务调度平台来调度任务,分配资源,这 ...

  7. Java eclipse导入外部项目时出错怎么解决

    从外部环境import一个项目进入Java工作环境中,若出现以下错误,解决方法如下: 鼠标移上去,会出现以下错误提示: 解决方法: 选中该项目->右键->Build path->Co ...

  8. Hadoop开启后jps显示只有jps

    之前在用Mapreduce写代码时,在DFS Location下的会报一个error,大体的意思就是与主机名相关的错误 然后我就觉得可能时Hadoop开启时出了错误,然后我就重启了Hadoop,jps ...

  9. arcgis中转换netCDF为栅格数据

    最近有个同学询问我一个问题,使用arcpy把netcdf转化成栅格文件,忙活了两个小时才搞定,其实主要代码非常简单,只不过要对arcgis 的功能比较熟悉(其实多思考和查考它的帮助文章,无聊) # - ...

  10. jQuery 获取不到 kindeditor 内容 的解决方法

    错误写法 :  var content = $('#Content').val(); 正确写法: var content = $(document.getElementsByTagName(" ...