洛谷P4456 交错序列[CQOI2018] dp+数论
正解: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+数论的更多相关文章
- 洛谷P1108 低价购买[DP | LIS方案数]
		
题目描述 “低价购买”这条建议是在奶牛股票市场取得成功的一半规则.要想被认为是伟大的投资者,你必须遵循以下的问题建议:“低价购买:再低价购买”.每次你购买一支股票,你必须用低于你上次购买它的价格购买它 ...
 - NOIP2017提高组Day2T2 宝藏 洛谷P3959 状压dp
		
原文链接https://www.cnblogs.com/zhouzhendong/p/9261079.html 题目传送门 - 洛谷P3959 题目传送门 - Vijos P2032 题意 给定一个 ...
 - 洛谷P1244 青蛙过河  DP/思路
		
又是一道奇奇怪怪的DP(其实是思路题). 原文戳>>https://www.luogu.org/problem/show?pid=1244<< 这题的意思给的挺模糊,需要一定的 ...
 - 洛谷P3928 Sequence2(dp,线段树)
		
题目链接: 洛谷 题目大意在描述底下有.此处不赘述. 明显是个类似于LIS的dp. 令 $dp[i][j]$ 表示: $j=1$ 时表示已经处理了 $i$ 个数,上一个选的数来自序列 $A[0]$ 的 ...
 - 洛谷P1140 相似基因 (DP)
		
洛谷P1140 相似基因 题目背景 大家都知道,基因可以看作一个碱基对序列.它包含了44种核苷酸,简记作A,C,G,TA,C,G,T.生物学家正致力于寻找人类基因的功能,以利用于诊断疾病和发明药物. ...
 - 洛谷P2224 [HNOI2001] 产品加工 [DP补完计划,背包]
		
题目传送门 产品加工 题目描述 某加工厂有A.B两台机器,来加工的产品可以由其中任何一台机器完成,或者两台机器共同完成.由于受到机器性能和产品特性的限制,不同的机器加工同一产品所需的时间会不同,若同时 ...
 - 洛谷1417 烹调方案 dp 贪心
		
洛谷 1417 dp 传送门 挺有趣的一道dp题目,看上去接近于0/1背包,但是考虑到取每个点时间不同会对最后结果产生影响,因此需要进行预处理 对于物品x和物品y,当时间为p时,先加x后加y的收益为 ...
 - 洛谷1387 二维dp 不是特别简略的题解 智商题
		
洛谷1387 dp题目,刚开始写的时候使用了前缀和加搜索,复杂度大概在O(n ^ 3)级别,感觉这么写还是比较对得起普及/提高-的难度的..后来看了题解区各位大神的题解,开始一脸mb,之后备受启发. ...
 - 洛谷 P2657 (数位DP)
		
### 洛谷 P2657 题目链接 ### 题目大意:给你一个数的范围 [A,B] ,问你这段区间内,有几个数满足如下条件: 1.两个相邻数位上的数的差值至少为 2 . 2.不包含前导零. 很简单的数 ...
 
随机推荐
- 【easy】226. Invert Binary Tree 反转二叉树
			
/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode ...
 - ES进阶--02
			
第11节深度探秘搜索技术_案例实战基于dis_max实现best fields策略进行多字段搜索 课程大纲 1.为帖子数据增加content字段 POST /forum/article/_bulk{ ...
 - Mockito框架入门教程(二)
			
接上一篇,继续学习其它的.... 8.找出冗余的互动(即未被验证到的) @Test(expected = NoInteractionsWanted.class) public void find_re ...
 - CentOS安装Supervisor
			
什么是Supervisor Supervisor是一个进程控制系统. 它是一个C/S系统,服务端是supervisord进程,控制端使用supervisorctl来进行控制启动进程.同时它也提供了一个 ...
 - python TextMining
			
01.Crawling url_request # -*- coding: utf-8 -*- """ Created on Sun Feb 17 11:08:44 20 ...
 - 向量 dot cross product 点积叉积 几何意义
			
向量 dot cross product 点积叉积 几何意义 有向量 a b 点积 a * b = |a| * |b| * cosθ 几何意义: 1. a * b == 0,则 a ⊥ b 2. a ...
 - Java 使用blob对H5视频播放进行加密《java视频加密》
			
1.创建一个H5 <video>标签 <video id="sound" type="video/mp4" controls="co ...
 - Jarvis OJ 一些简单的re刷题记录和脚本
			
[61dctf] androideasy 164求解器 50 相反 脚本如下: s='' a=113, 123, 118, 112, 108, 94, 99, 72, 38, 68, 72, 87, ...
 - 第八篇 Flask配置
			
Flask 是一个非常灵活且小而精的web框架 , 那么灵活性从什么地方体现呢? 列如 Flask配置,这个东西怎么用呢? 它能给我们带来怎么样的方便呢? app配置 首先展示一下: from fl ...
 - S0.3 直方图
			
目录 直方图(一) 直方图概念 直方图分类 直方图优点 直方图应用 opencv3直方图产生函数cvCalcHist() 画图函数 完整示例 直方图(一) 直方图概念 直方图是图像中像素强度分布的图形 ...