\(\color{#0066ff}{ 题目描述 }\)

曾经发明了脑洞治疗仪与超能粒子炮的发明家 SHTSC 又公开了他的新发明:超能粒子炮・改——一种可以发射威力更加强大的粒子流的神秘装置。

超能粒子炮・改相比超能粒子炮,在威力上有了本质的提升。它有两个参数\(n\),\(k\),它会向每个编号为\(0\)到\(k\)(包含两端)的位置\(i\)发射威力为\(C_{n}^{i} mod 2333\)的粒子流。

现在 SHTSC 给出了他的超能粒子炮・改的参数,让你求出其发射的粒子流的威力之和除以\(2333\)所得的余数。

\(\color{#0066ff}{输入格式}\)

第一行一个整数\(t\)表示数据组数。 之后 \(t\) 行,每行两个整数 \(n\)、\(k\),含义如题面描述。

\(\color{#0066ff}{输出格式}\)

t 行,每行一个整数,表示其粒子流的威力之和模 2333 的值。

\(\color{#0066ff}{输入样例}\)

3
5 5
10 7
1145 14

\(\color{#0066ff}{输出样例}\)

32
968
763

\(\color{#0066ff}{数据范围与提示}\)

\(\color{#0066ff}{ 题解 }\)

令\(p=2333, f(n,k)=\begin{aligned}\sum_{i=0}^kC_n^i\end{aligned}\)

考虑将\([0,k]\)分成一些段

可以发现,对于\(i\in [0, p*\lfloor\frac k p \rfloor)\),分成了\(\lfloor\frac k p \rfloor\)段,每段长度为p,根据\((\lfloor\frac i p\rfloor, i \% p)\)可以唯一确定一个i

据Lucas定理,有\(C_n^i=C_{n/p}^{i/p}*C_{n\%p}^{i\%p}\)

根据乘法原理,贡献为\(f(\lfloor\frac n p\rfloor,\lfloor\frac k p\rfloor - 1)*f(n\%p,p-1)\)

考虑剩下的部分,\(i\in[p*\lfloor\frac k p\rfloor,k]\)

显然剩下部分的\(\lfloor \frac i p\rfloor\)是一样的

贡献为\(C_{n/p}^{k/p}*f(n\%p,k\%p)\)

于是,总贡献为\(f(n,k)=C_{n/p}^{k/p}*f(n\%p,k\%p)+f(\lfloor\frac n p\rfloor,\lfloor\frac k p\rfloor - 1)*f(n\%p,p-1)\)

预处理出p以内的f值,在预处理阶乘和逆元之后,\(O(p^2)\)就能处理,这些值调用比较频繁

剩下的C直接Lucas就行了

#include<bits/stdc++.h>
#define LL long long
LL in() {
char ch; LL x = 0, f = 1;
while(!isdigit(ch = getchar()))(ch == '-') && (f = -f);
for(x = ch ^ 48; isdigit(ch = getchar()); x = (x << 1) + (x << 3) + (ch ^ 48));
return x * f;
}
const int mod = 2333;
const int maxn = 3e3 + 10;
LL f[maxn][maxn], fac[maxn], inv[maxn];
LL ksm(LL x, LL y) {
LL re = 1LL;
while(y) {
if(y & 1) re = re * x % mod;
x = x * x % mod;
y >>= 1;
}
return re;
}
LL C(LL n, LL m) {
if(m > n || m < 0) return 0;
if(n >= mod || m >= mod) return C(n / mod, m / mod) * C(n % mod, m % mod) % mod;
return ((fac[n] * inv[m] % mod) * inv[n - m]) % mod;
}
LL work(LL n, LL k) {
if(n < mod && k < mod) return f[n][k];
return ((C(n / mod, k / mod) * work(n % mod, k % mod) % mod) + (work(n / mod, k / mod - 1) * work(n % mod, mod - 1) % mod)) % mod;
}
void predoit() {
fac[0] = 1;
for(int i = 1; i < mod; i++) fac[i] = 1LL * i * fac[i - 1] % mod;
inv[mod - 1] = ksm(fac[mod - 1], mod - 2);
for(int i = mod - 2; i >= 0; i--) inv[i] = 1LL * inv[i + 1] * (i + 1) % mod;
for(int i = 0; i < mod; i++) {
f[i][0] = 1;
for(int j = 1; j < mod; j++)
f[i][j] = (f[i][j - 1] + C(i, j)) % mod;
}
}
signed main() {
predoit();
for(int T = in(); T --> 0;) {
LL n = in(), k = in();
printf("%lld\n", work(n, k));
}
return 0;
}

P4345 [SHOI2015]超能粒子炮·改 Lucas的更多相关文章

  1. bzoj4591 / P4345 [SHOI2015]超能粒子炮·改

    P4345 [SHOI2015]超能粒子炮·改 题意:求$\sum_{i=1}^{k}C(n,i)\%(P=2333)$ 肯定要先拆开,不然怎么做呢(大雾) 把$C(n,i)$用$lucas$分解一下 ...

  2. 洛谷 P4345 [SHOI2015]超能粒子炮·改 解题报告

    P4345 [SHOI2015]超能粒子炮·改 题意 求\(\sum_{i=0}^k\binom{n}{i}\),\(T\)组数据 范围 \(T\le 10^5,n,j\le 10^{18}\) 设\ ...

  3. bzoj 4591: [Shoi2015]超能粒子炮·改 [lucas定理]

    4591: [Shoi2015]超能粒子炮·改 题意:多组询问,求 \[ S(n, k) = \sum_{i=0}^n \binom{n}{i} \mod 2333,\ k \le n \le 10^ ...

  4. 【bzoj4591】[Shoi2015]超能粒子炮·改 Lucas定理

    题目描述 曾经发明了脑洞治疗仪&超能粒子炮的发明家SHTSC又公开了他的新发明:超能粒子炮·改--一种可以发射威力更加强大的粒子流的神秘装置.超能粒子炮·改相比超能粒子炮,在威力上有了本质的提 ...

  5. loj 2038 / 洛谷 P4345 [SHOI2015] 超能粒子炮・改 题解

    好玩的推式子 题目描述 曾经发明了脑洞治疗仪与超能粒子炮的发明家 SHTSC 又公开了他的新发明:超能粒子炮・改--一种可以发射威力更加强大的粒子流的神秘装置. 超能粒子炮・改相比超能粒子炮,在威力上 ...

  6. [bzoj4591][Shoi2015][超能粒子炮·改] (lucas定理+组合计数)

    Description 曾经发明了脑洞治疗仪&超能粒子炮的发明家SHTSC又公开了他的新发明:超能粒子炮·改--一种可以发射威力更加 强大的粒子流的神秘装置.超能粒子炮·改相比超能粒子炮,在威 ...

  7. Luogu4345 SHOI2015 超能粒子炮·改 Lucas、数位DP

    传送门 模数小,还是个质数,Lucas没得跑 考虑Lucas的实质.设\(a = \sum\limits_{i=0}^5 a_i 2333^i\),\(b = \sum\limits_{i=0}^5 ...

  8. [BZOJ4591][SHOI2015]超能粒子炮·改(Lucas定理+数位DP)

    大组合数取模可以想到Lucas,考虑Lucas的意义,实际上是把数看成P进制计算. 于是问题变成求1~k的所有2333进制数上每一位数的组合数之积. 数位DP,f[i][0/1]表示从高到低第i位,这 ...

  9. P4345 [SHOI2015]超能粒子炮·改

    传送门 看到数据和模数大小就知道要上 lucas 了 然后开始愉快地推公式: 答案为 $\sum _{i=0}^kC_{n}^{i}\ (mod\ 2333)$ 设 $f [ i ] [ j ] = ...

随机推荐

  1. CS231n 2016 通关 第三章-SVM与Softmax

    1===本节课对应视频内容的第三讲,对应PPT是Lecture3 2===本节课的收获 ===熟悉SVM及其多分类问题 ===熟悉softmax分类问题 ===了解优化思想 由上节课即KNN的分析步骤 ...

  2. java 多线程系列基础篇(七)之线程休眠

    1. sleep()介绍 sleep() 定义在Thread.java中.sleep() 的作用是让当前线程休眠,即当前线程会从“运行状态”进入到“休眠(阻塞)状态”.sleep()会指定休眠时间,线 ...

  3. Android Studio 第一次配置及其使用

    第一次使用Android Studio时你应该知道的一切配置 http://www.cnblogs.com/smyhvae/p/4390905.html gradle V2.10 版: http:// ...

  4. MongoDB中的查询

    MongoDB中文文档:http://docs.mongoing.com/manual-zh/contents.html 这里以集合名称为test为例,数据库通过for循环插入一些测试数据,键分别为: ...

  5. java连接字符串操作,可用来向sql传值

    private static String concat(String tag,String Time) { // TODO Auto-generated method stub // return ...

  6. 【273】利用ArcPy建立处理数据的脚本

    这个脚本可以直接运行处理程序,首先在 ArcPy 上面测试,成功后写入文件,下面的代码实现将指定文件夹内部的栅格数据进行 Calculate Statistics 操作,否则在进行专题图制作的时候会出 ...

  7. 虚拟机VMware的安装以及指南

    VMware是一个非常强大的虚拟软件,它的更新速度非常的快,随着软件的更新速度的加快,它的大小会越来越大,但是新的版本大多数会是给企业使用的,对于我们而言,不那么的需要,所以,我们只需要使用一些差不多 ...

  8. struts2学习笔记(1)配置与基本操作

    主要作用:将请求与页面区分开 配 置: 下载struts 2.0,在安装路径D:\项目学习\三大框架视屏\struts-2.3.24-all\struts-2.3.24\apps 中解压struts2 ...

  9. css知多少(5)——选择器(转)

    css知多少(5)——选择器   1. 引言 从本节开始,就进入本系列的第二个部分——css和html的结合——说白了就是选择器. CSS中定义了样式,如何将这些样式设置到相应的html节点上?就不得 ...

  10. Nginx 正向代理和反向代理

    正向代理的概念 正向代理,也就是传说中的代理,他的工作原理就像一个跳板,简单的说,我是一个用户,我访问不了某网站,但是我能访问一个代理服务器这个代理服务器呢,他能访问那个我不能访问的网站于是我先连上代 ...