当前位置: 首页 > news >正文

P4345 [SHOI2015]超能粒子炮·改 Lucas

\(\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}{数据范围与提示}\)

16203.png

\(\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;
}

转载于:https://www.cnblogs.com/olinr/p/10307643.html

相关文章:

  • boost库:字符串处理
  • OpenSSL生成私钥和公钥
  • centos7.5配置双网卡上网
  • 工作总结报告
  • 孤荷凌寒自学python第七十八天开始写Python的第一个爬虫8
  • java 多线程
  • .NET Core IdentityServer4实战-开篇介绍与规划
  • Matplotlib中plt.rcParams用法(设置图像细节)
  • 14-tail-and-head-commands-linuxunix
  • Apollo的Oracle适配改动
  • 甄姬
  • Sql 排序
  • contest3 CF994 div2 ooxxx? oooox? ooooo?
  • 梯度下降算法对比(批量下降/随机下降/mini-batch)
  • Angular CLI的简单使用(2)
  • [译]如何构建服务器端web组件,为何要构建?
  • 【RocksDB】TransactionDB源码分析
  • eclipse(luna)创建web工程
  • export和import的用法总结
  • Java Agent 学习笔记
  • JavaScript HTML DOM
  • JavaScript函数式编程(一)
  • Vue全家桶实现一个Web App
  • Webpack 4x 之路 ( 四 )
  • 成为一名优秀的Developer的书单
  • 多线程 start 和 run 方法到底有什么区别?
  • 基于MaxCompute打造轻盈的人人车移动端数据平台
  • 我有几个粽子,和一个故事
  • 在Docker Swarm上部署Apache Storm:第1部分
  • Mac 上flink的安装与启动
  • PostgreSQL之连接数修改
  • 函数计算新功能-----支持C#函数
  • # 学号 2017-2018-20172309 《程序设计与数据结构》实验三报告
  • #设计模式#4.6 Flyweight(享元) 对象结构型模式
  • (2)STM32单片机上位机
  • (C)一些题4
  • (done) NLP “bag-of-words“ 方法 (带有二元分类和多元分类两个例子)词袋模型、BoW
  • (Redis使用系列) SpirngBoot中关于Redis的值的各种方式的存储与取出 三
  • (超详细)语音信号处理之特征提取
  • (附源码)python房屋租赁管理系统 毕业设计 745613
  • (附源码)计算机毕业设计SSM在线影视购票系统
  • (机器学习-深度学习快速入门)第一章第一节:Python环境和数据分析
  • (十) 初识 Docker file
  • (一)appium-desktop定位元素原理
  • .NET/C# 使用反射注册事件
  • .NET/C# 在代码中测量代码执行耗时的建议(比较系统性能计数器和系统时间)
  • .NET中winform传递参数至Url并获得返回值或文件
  • [.net]官方水晶报表的使用以演示下载
  • [20150904]exp slow.txt
  • [CareerCup] 6.1 Find Heavy Bottle 寻找重瓶子
  • [FFmpeg学习]从视频中获取图片
  • [hdu 2896] 病毒侵袭 [ac自动机][病毒特征码匹配]
  • [iOS]GCD(一)
  • [ISITDTU 2019]EasyPHP
  • [JMS 3] ActiveMQ实现简单的helloworld