Description

题库链接

定义长度为 \(n\) 的“交错序列”为:长度为 \(n\) 序列中仅含 \(0,1\) 且没有相邻的 \(1\) 。给出 \(a,b\) ,假设序列中有 \(x\) 个 \(0\) , \(y\) 个 \(1\) 。定义该“交错序列”的价值为 \(x^a\times y^b\) ,特别地 \(0^0=1\) 。求所有长度为 \(n\) 的交错序列的价值的和。对质数 \(m\) 取模。

\(1\leq n\leq 10000000,1\leq m\leq 100000000,1\leq a,b\leq 45\)

Solution

傻逼题啊,组合数+ \(lucas\) 乱搞一下就好了。

式子就是: \(\sum\limits_{i=0}^{\left\lfloor\frac{n+1}{2}\right\rfloor}(n-i)^a\times i^b\times{n-i+1\choose i}\)

正好 \(O(n)\) ,乱搞交了

あら? \(lucas\) 也有个 \(\log\) 啊!!! f**k , 45pts 。

观察式子 \(x^a\times y^b\) ,等价于 \((n-y)^a\times y^b\) 。

\[\sum_{i=0}^a{a\choose i}(-1)^{a-i}n^iy^{a+b-i}\]

那么我们只要算出 \(y^i\) ,最后乘上 \({a\choose i}(-1)^{a-i}n^i\) 即可。

记 \(f_{i,j,0/1}\) 表示长度为 \(i\) 的序列结尾为 \(0/1\) 且所有 \(1\) 的个数(即式子中的 \(y\) )的 \(j\) 次方和。

考虑转移,注意到如果这一位填 \(0\) ,那么是与式子中的 \(y\) 无关的,显然

\[f_{i-1,j,0}+f_{i-1,j,1}\rightarrow f_{i,j,0}\]

如果这一位填 \(1\) ,假设 \(y'=y+1\) ,那么 \(y'^i=(y+1)^i=\sum\limits_{j=0}^i {i\choose j}y^j\)

那么,

\[\sum_{k=0}^j{j\choose k}f_{i-1,k,0}\rightarrow f_{i,j,1}\]

初值 \(f_{0,0,0}=1\) ,长度为 \(0\) 含有 \(0\) 个 \(1\) 。可以用矩阵乘法加速。

复杂度 \(O((2(a+b))^3\log_2 n)\) 。有点卡常...

Code

45pts

#include <bits/stdc++.h>
using namespace std;
const int N = 10000000+5; int n, m, a, b, ifac[N], fac[N]; int quick_pow(int a, int b) {
int ans = 1;
while (b) {
if (b&1) ans = 1ll*ans*a%m;
b >>= 1, a = 1ll*a*a%m;
}
return ans;
}
int C(int n, int m, int p) {
if (n < m) return 0;
return 1ll*fac[n]*ifac[m]%p*ifac[n-m]%p;
}
int lucas(int n, int m, int p) {
if (!m || n == m) return 1; if (n < m) return 0;
return 1ll*lucas(n/p, n/p, p)*C(n%p, m%p, p)%p;
}
void work() {
scanf("%d%d%d%d", &n, &a, &b, &m);
int l = min(n+1, m);
ifac[0] = ifac[1] = fac[0] = fac[1] = 1;
for (int i = 2; i < l; i++) ifac[i] = -1ll*(m/i)*ifac[m%i]%m;
for (int i = 2; i <= l; i++)
ifac[i] = 1ll*ifac[i]*ifac[i-1]%m,
fac[i] = 1ll*i*fac[i-1]%m;
int ans = 0;
for (int i = 0; i*2-1 <= n; i++) {
(ans += 1ll*quick_pow(n-i, a)*quick_pow(i, b)%m*lucas(n-i+1, i, m)%m) %= m;
}
printf("%d\n", (ans+m)%m);
}
int main() {work(); return 0; }

100pts

#include <bits/stdc++.h>
using namespace std;
const int N = 200+5; int n, a, b, m, C[N][N], sz1, sz2;
struct mat {
int a[N][N];
mat() {}
mat operator * (const mat &b) const {
mat ans;
for (int i = 0; i < sz2; i++)
for (int j = 0; j < sz2; j++) {
ans.a[i][j] = 0;
for (int k = 0; k < sz2; k++)
if (a[i][k] && b.a[k][j])
(ans.a[i][j] += 1ll*a[i][k]*b.a[k][j]%m) %= m;
}
return ans;
}
}S, T; void work() {
scanf("%d%d%d%d", &n, &a, &b, &m);
sz1 = a+b+1, sz2 = sz1<<1;
for (int i = 0; i <= sz1; i++) {
C[i][0] = 1;
for (int j = 1; j <= i; j++) C[i][j] = (C[i-1][j-1]+C[i-1][j])%m;
}
for (int i = 0; i < sz1; i++) {
T.a[i][i] = 1, T.a[i+sz1][i] = 1;
for (int j = i; j < sz1; j++) T.a[i][j+sz1] = C[j][i];
}
S.a[0][0] = 1; int t = n;
while (t) {
if (t&1) S = S*T;
T = T*T, t >>= 1;
}
int ans = 0;
for (int i = 0, pw = 1; i <= a; i++, pw = 1ll*pw*n%m) {
ans += 1ll*((a-i)&1 ? -1 : 1)*C[a][i]*pw%m*(S.a[0][a+b-i]+S.a[0][a+b+sz1-i])%m;
ans %= m;
}
printf("%d\n", (ans+m)%m);
}
int main() {work(); return 0; }

[CQOI 2018]交错序列的更多相关文章

  1. 「杂录」CQOI 2018 背板记

    背景 经过一天天的等待,终于迎来了\(CQOI2018\),想想\(NOIp\)过后到现在,已经有了快要半年了,曾经遥遥无期,没想到时间一转眼就过去了-- 日志 \(Day0\) 因为明天就要考试了, ...

  2. [CQOI 2018]异或序列&[Codeforces 617E]XOR and Favorite Number

    Description 题库链接1 题库链接2 已知一个长度为 \(n\) 的整数数列 \(a_1,a_2,\cdots,a_n\) ,给定查询参数 \(l,r\) ,问在 \([l,r]\) 区间内 ...

  3. [CQOI 2018]解锁屏幕

    Description 题库链接 给出平面上 \(n\) 个点,一开始你可以选任何一个点作为起点,接着对于每一个你在的位置,你可以选取一个未走过的点.将路径(线段)上所有的点均选上(包括起点终点),并 ...

  4. [CQOI 2018]九连环

    Description 题库链接 给你一个 \(n\) 连环,游戏规则是: 第一个(最右边)环任何时候都可以任意装上或卸下: 如果第 \(k\) 个环没有被卸下,且第 \(k\) 个环右边的所有环都被 ...

  5. [CQOI 2018]破解D-H协议

    Description 题库链接 给出 \(A,B,P,g\) ,\(g\) 是 \(P\) 的原根,求出 \(A\equiv g^a\pmod{P}\) , \(B\equiv g^b\pmod{P ...

  6. [CQOI 2018]社交网络

    Description 题库链接 求 \(n\) 个点以 \(1\) 为根的有向生成树个数. \(1\leq n\leq 250\) Solution 我终于会 \(\texttt{Matrix-Tr ...

  7. [ CQOI 2018 ] 异或序列

    \(\\\) Description 给出一个长为 \(n\) 的数列 \(A\) 和 \(k\),多次询问: 对于一个区间 \([L_i,R_i]\),问区间内有多少个不为空的子段异或和为 \(k\ ...

  8. 2018. The Debut Album

    http://acm.timus.ru/problem.aspx?space=1&num=2018 真心爱过,怎么能彻底忘掉 题目大意: 长度为n的串,由1和2组成,连续的1不能超过a个,连续 ...

  9. Math.abs(~2018),掌握规律即可!

    Math.abs(~2018) 某前端群的入门问题长姿势了,一个简单的入门问题却引发了我的思考,深深的体会到自己在学习前端技术的同时忽略遗忘了一些计算机的基础知识. 对于 JS Math对象没什么可说 ...

随机推荐

  1. Spring Boot 应用系列 1 -- Spring Boot 2 整合Spring Data JPA和Druid,双数据源

    最近Team开始尝试使用Spring Boot + Spring Data JPA作为数据层的解决方案,在网上逛了几圈之后发现大家并不待见JPA,理由是(1)MyBatis简单直观够用,(2)以Hib ...

  2. App主导现在 HTML5领衔未来

    HTML5能够让开发人员构建丰富的基于Web应用程序,使其能在任何设备中使用标准的Web浏览器.很多人认为HTML5将会让App过时.到底App还是HTML5会是谁赢得最后的胜利,在业界也有不少讨论, ...

  3. Linux(Debian)网卡设置

    debian IP地址配置 vim /etc/network/interface   配置网卡eth0的IP地址 auto eth0 表示网卡随系统自动请 iface eth0 inet static ...

  4. PhoneGap - 解决用nmp无法安装PhoneGap问题!

    PhoneGap从2.9.0开始,只采用node安装方式,安装命令如下: npm install -g phonegap 今天我使用此命令安装PhoneGap时候,始终无法安装,在网上搜索一下,最终解 ...

  5. Recursion-687. Longest Univalue Path

    Given a binary tree, find the length of the longest path where each node in the path has the same va ...

  6. sql语句_统计总成绩最高的前2名

    有一个数据表,id user_id score 三个字段,计算总成绩最高的前两名 SELECT * FROM (SELECT user_name,SUM(score) AS score FROM us ...

  7. SQL 必知必会 总结(一)

    SQL必知必会 总结(一) 第 1 课 了解SQL 1.数据库(database): 保存有组织的数据容器(通常是一个文件或一组文件). 2.数据库管理系统(DBMS): 数据库软件,数据库是通过 D ...

  8. 使用git工具删除github上的文件或者文件夹

    解决 使用git工具删除github上的文件或者文件夹 当我们需要从github上删除一些我们不需要的文件或者文件夹时,如果通过github来操作的话,将会很麻烦,因为github只允许删除一个仓库, ...

  9. 如何解决jade标签没有闭合,如input

    最近用jade模板引擎编写html时发现input编译输出为<input>,而我想要的效果为<input/>, 如何解决呢,这时我们可以这样写: input/     ---& ...

  10. js时间的应用(再看看前面,会发现不一样的)

    1.年份(1970-) 获取 date.getFullYear(); 设置 date.setFullYear(2016); 2.月份(0-11) 0代表1月 获取 date.getMonth() 设置 ...