正解: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. 【easy】226. Invert Binary Tree 反转二叉树

    /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode ...

  2. ES进阶--02

    第11节深度探秘搜索技术_案例实战基于dis_max实现best fields策略进行多字段搜索 课程大纲 1.为帖子数据增加content字段 POST /forum/article/_bulk{ ...

  3. Mockito框架入门教程(二)

    接上一篇,继续学习其它的.... 8.找出冗余的互动(即未被验证到的) @Test(expected = NoInteractionsWanted.class) public void find_re ...

  4. CentOS安装Supervisor

    什么是Supervisor Supervisor是一个进程控制系统. 它是一个C/S系统,服务端是supervisord进程,控制端使用supervisorctl来进行控制启动进程.同时它也提供了一个 ...

  5. python TextMining

    01.Crawling url_request # -*- coding: utf-8 -*- """ Created on Sun Feb 17 11:08:44 20 ...

  6. 向量 dot cross product 点积叉积 几何意义

    向量 dot cross product 点积叉积 几何意义 有向量 a b 点积 a * b = |a| * |b| * cosθ 几何意义: 1. a * b == 0,则 a ⊥ b 2. a ...

  7. Java 使用blob对H5视频播放进行加密《java视频加密》

    1.创建一个H5 <video>标签 <video id="sound" type="video/mp4" controls="co ...

  8. Jarvis OJ 一些简单的re刷题记录和脚本

    [61dctf] androideasy 164求解器 50 相反 脚本如下: s='' a=113, 123, 118, 112, 108, 94, 99, 72, 38, 68, 72, 87, ...

  9. 第八篇 Flask配置

    Flask 是一个非常灵活且小而精的web框架 , 那么灵活性从什么地方体现呢? 列如  Flask配置,这个东西怎么用呢? 它能给我们带来怎么样的方便呢? app配置 首先展示一下: from fl ...

  10. S0.3 直方图

    目录 直方图(一) 直方图概念 直方图分类 直方图优点 直方图应用 opencv3直方图产生函数cvCalcHist() 画图函数 完整示例 直方图(一) 直方图概念 直方图是图像中像素强度分布的图形 ...