题目大意:有$n(n\leqslant3500)$个人坐成一个环,$0$号手上有个球,每秒钟可以向左或向右传球,问$m$秒后球在$0$号手上的方案数。

题解:一个$O(nm)$的$DP$,$f_{i,j}=f_{i-1,j-1}+f_{i-1,j+1}$($f_{i,j}$表示现在为第$i$秒,球在$j$号手上的方案数)。这样明显不可以通过。

生成函数,$x^i$对应为原环上第$|i|\bmod n$个人,于是发现$f_{i,m}=\sum\limits_{k\in\mathbb Z}[x^{i+kn}](x^{-1}+x)^m$,所以答案为$\sum\limits_{k\in\mathbb Z}[x^{kn}](x^{-1}+x)^m$。这样感觉不可做,但是把它变成循环卷积后,答案就是$[x^0](x^{n-1}+x)^m$,复杂度$O(n\log_2n\log_2m)$。

注意,模数为$10^9+7$,需要三模$NTT$

卡点:

C++ Code:

#include <algorithm>
#include <cstdio>
#define maxn 3510
const int mod = 1e9 + 7; namespace Math {
inline int pw(int base, int p, const int mod) {
static int res;
for (res = 1; p; p >>= 1, base = static_cast<long long> (base) * base % mod) if (p & 1) res = static_cast<long long> (res) * base % mod;
return res;
}
inline int inv(int x, const int mod) { return pw(x, mod - 2, mod); }
} int n, m;
namespace Poly {
#define N 8192
inline void clear(register int *l, const int *r) {
if (l >= r) return ;
while (l != r) *l++ = 0;
}
template <const int mod, const int G> struct P {
int lim, s, rev[N];
int Wn[N | 1];
inline void reduce(int &x) { x += x >> 31 & mod; }
inline void init(int n) {
lim = 1, s = -1; while (lim < n) lim <<= 1, ++s;
for (register int i = 1; i < lim; ++i) rev[i] = rev[i >> 1] >> 1 | (i & 1) << s;
const int t = Math::pw(G, (mod - 1) / lim, mod);
*Wn = 1; for (register int *i = Wn; i != Wn + lim; ++i) *(i + 1) = static_cast<long long> (*i) * t % mod;
}
inline void NTT(int *A, const int op = 1) {
for (register int i = 1; i < lim; ++i) if (i < rev[i]) std::swap(A[i], A[rev[i]]);
for (register int mid = 1; mid < lim; mid <<= 1) {
const int t = lim / mid >> 1;
for (register int i = 0; i < lim; i += mid << 1) {
for (register int j = 0; j < mid; ++j) {
const int W = op ? Wn[j * t] : Wn[lim - j * t];
const int X = A[i + j], Y = static_cast<long long> (A[i + j + mid]) * W % mod;
reduce(A[i + j] += Y - mod), reduce(A[i + j + mid] = X - Y);
}
}
}
if (!op) {
const int ilim = Math::inv(lim, mod);
for (register int *i = A; i != A + lim; ++i) *i = static_cast<long long> (*i) * ilim % mod;
}
} int res[N];
inline int operator [] (const int i) { return res[i]; } int C[N], D[N];
void MUL(int *A, int *B) {
std::copy(A, A + n, C), clear(C + n, C + lim);
std::copy(B, B + n, D), clear(D + n, D + lim);
NTT(C), NTT(D);
for (int i = 0; i < lim; i++) res[i] = static_cast<long long> (C[i]) * D[i] % mod;
NTT(res, 0);
}
void SQR(int *A) {
std::copy(A, A + n, C), clear(C + n, C + lim);
NTT(C);
for (int i = 0; i < lim; i++) res[i] = static_cast<long long> (C[i]) * C[i] % mod;
NTT(res, 0);
}
} ;
const int mod1 = 469762049, mod2 = 998244353, mod3 = 1004535809;
const long long mod_1_2 = static_cast<long long> (mod1) * mod2;
const int inv_1 = Math::inv(mod1, mod2), inv_2 = Math::inv(mod_1_2 % mod3, mod3);
P<mod1, 3> P1;
P<mod2, 3> P2;
P<mod3, 3> P3;
inline int get(const int A, const int B, const int C) {
const long long x = static_cast<long long> (B - A + mod2) % mod2 * inv_1 % mod2 * mod1 + A;
return (static_cast<long long> (C - x % mod3 + mod3) % mod3 * inv_2 % mod3 * (mod_1_2 % mod) % mod + x) % mod;
} inline void reduce(int &x) { x += x >> 31 & mod; }
inline void init(int n) {
P1.init(n), P2.init(n), P3.init(n);
}
void MUL(int *A, int *B) {
P1.MUL(A, B), P2.MUL(A, B), P3.MUL(A, B);
for (int i = 0; i < n + n; i++) reduce(A[i] = get(P1[i], P2[i], P3[i]) + get(P1[i + n], P2[i + n], P3[i + n]) - mod);
}
void SQR(int *A) {
P1.SQR(A), P2.SQR(A), P3.SQR(A);
for (int i = 0; i < n + n; i++) reduce(A[i] = get(P1[i], P2[i], P3[i]) + get(P1[i + n], P2[i + n], P3[i + n]) - mod);
}
inline void PW(int *res, int *base, int p) {
init(n << 1);
res[0] = 1, clear(res + 1, res + n);
while (p) {
if (p & 1) MUL(res, base);
p >>= 1;
if (p) SQR(base);
}
}
#undef N
} int f[8192], g[8192];
int main() {
scanf("%d%d", &n, &m);
f[1] = f[n - 1] = 1;
Poly::PW(g, f, m);
printf("%d\n", g[0]);
return 0;
}

[洛谷P5173]传球的更多相关文章

  1. 洛谷P5173 传球(暴力)

    传送门 真·暴力艹过去 不难发现这个转移其实就是一个循环卷积的形式,设有多项式\(A=x+x^{n-1}\),那么\(f_m=f_0\times A^m\) 直接暴力计算并卡常就行了 //minamo ...

  2. 洛谷 P1057 传球游戏 解题报告

    P1057 传球游戏 题目描述 上体育课的时候,小蛮的老师经常带着同学们一起做游戏.这次,老师带着同学们一起做传球游戏. 游戏规则是这样的:n个同学站成一个圆圈,其中的一个同学手里拿着一个球,当老师吹 ...

  3. 洛谷 P1057 传球游戏 【dp】(经典)

    题目链接:https://www.luogu.org/problemnew/show/P1057 题目描述 上体育课的时候,小蛮的老师经常带着同学们一起做游戏.这次,老师带着同学们一起做传球游戏. 游 ...

  4. 洛谷P1057 传球游戏【dp】

    题目:https://www.luogu.org/problemnew/show/P1057 题意: n个人围成一个圈,传球只能传给左边或是右边. 从第一个人开始传起,经过m次之后回到第一个人的传球方 ...

  5. 洛谷P1057 传球游戏(记忆化搜索)

    点我进入题目 题目大意:n个小孩围一圈传球,每个人可以给左边的人或右边的人传球,1号小孩开始,一共传m次,请问有多少种可能的路径使球回到1号小孩. 输入输出:输入n,m,输出路径的数量. 数据范围:4 ...

  6. 洛谷 P1057 传球游戏

    题目描述 上体育课的时候,小蛮的老师经常带着同学们一起做游戏.这次,老师带着同学们一起做传球游戏. 游戏规则是这样的:n个同学站成一个圆圈,其中的一个同学手里拿着一个球,当老师吹哨子时开始传球,每个同 ...

  7. Codevs 1148 == 洛谷 P1057 传球游戏

    1148 传球游戏 2008年NOIP全国联赛普及组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 白银 Silver 题目描述 Description 上体育课的时候,小蛮的老师 ...

  8. 洛谷——P1057 传球游戏

    P1057 传球游戏 题目描述 上体育课的时候,小蛮的老师经常带着同学们一起做游戏.这次,老师带着同学们一起做传球游戏. 游戏规则是这样的:n个同学站成一个圆圈,其中的一个同学手里拿着一个球,当老师吹 ...

  9. 洛谷P1057 传球游戏【递归+搜索】

    上体育课的时候,小蛮的老师经常带着同学们一起做游戏.这次,老师带着同学们一起做传球游戏. 游戏规则是这样的:nn个同学站成一个圆圈,其中的一个同学手里拿着一个球,当老师吹哨子时开始传球,每个同学可以把 ...

随机推荐

  1. Python之celery

    一.celery简介 Celery是一个Python开发的异步分布式任务调度模块.celery本身不提供消息服务,使用第三方服务,也就是borker来传递任务,目前支持rebbing, redis, ...

  2. 关于iOS开发的各种证书

    关于iOS开发的各种证书 最近在接推送服务的时候,被各种证书弄得不亦晕乎,这里记录一下一些基本的证书作用: 1. App IDs appID分明确的和通配的两种,如果要使用推送功能,只能用明确的. 2 ...

  3. xencenter迁移云主机方法

    问题:POOL中计算节点内存不足. 解决方法:1.为计算节点添加内存(费用高)2.将部分资源迁移到其它POOL中. 方法: 1.选择要迁移的虚拟机 2.选择保存路径 这里可以看到可以批量导出: 注意: ...

  4. redis 问题记录

    摘抄来自:https://zhuoroger.github.io/ 1.slowlog和排队延时 slowlog是排查性能问题关键监控指标.它是记录Redis queries运行时间超时特定阀值的系统 ...

  5. Python拼接字符串的7种方法

    1.直接通过+操作: s = 'Python'+','+'你好'+'!'print(s) 打印结果: Python,你好! 2.通过join()方法拼接: 将列表转换成字符串 strlist=['Py ...

  6. 第一阶段·Linux运维基础-第2章·Linux系统目录结构介绍

    01 变量与PS1 02 添加用户 03 关闭SELinux 04 关闭iptables 05 显示中文乱码排查过程 06 总结 07 目录结构课程内容 08 Linux目录结构特点 09 Linux ...

  7. VMware 15.0下载及安装教程

    虚拟机 VMware WorkStation Pro15 下载及安装详细解 9虚拟机 VMware WorkStation Pro15 下载及安装详细解. 虚拟机官方网站: https://www.v ...

  8. (Pyhton爬虫03)爬虫初识

    原本的想法是这样的:博客整理知识学习的同时,也记录点心情...集中式学习就没这么多好记录的了! 要学习一门技术,首先要简单认识一下爬虫!其实可以参考爬虫第一章! 整体上介绍该技术包含技能,具体能做什么 ...

  9. TW实习日记:第22天

    今天开发项目的还没完成的功能点,没什么难的,样式复制粘贴,JSON表单配一配,接口调一调,基本就完成了.不过中间在写后台的一些接口时,发现被自己之前写的一些方法给坑了.为什么这样说呢,因为在之前的几个 ...

  10. 孤荷凌寒自学python第八十四天搭建jTessBoxEditor来训练tesseract模块

    孤荷凌寒自学python第八十四天搭建jTessBoxEditor来训练tesseract模块 (完整学习过程屏幕记录视频地址在文末) 由于本身tesseract模块针对普通的验证码图片的识别率并不高 ...