bzoj4591 [Shoi2015]超能粒子炮·改——组合数学(+求阶乘逆元新姿势)
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4591
这题不是很裸啊(所以我就不会了)
得稍微推导一下,看这个博客好了:https://blog.csdn.net/All_ice/article/details/68947444
以前求 1~n 的阶乘逆元一直是先用费马小定理求出 n! 的逆元,再每次 *i 递推回去;
这次用了另一种递推求阶乘逆元的方法,其实就是递推求逆元再阶乘起来:https://blog.csdn.net/w4149/article/details/72847276?locationNum=6&fps=1
预处理 C 会稍微快一点(但还是很慢啊)。
代码如下:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
typedef long long ll;
int const mod=;
ll T,n,k,fac[mod+],inv[mod+],sum[mod+][mod+],c[mod+][mod+];
ll C(int n,int m)
{
if(n<m)return ;
return c[n][m];
// return ((fac[n]*inv[m])%mod*inv[n-m])%mod;
}
ll Lucas(ll n,ll m)
{
if(m==)return ;
return (C(n%mod,m%mod)*Lucas(n/mod,m/mod))%mod;
}
void init()
{
fac[]=; c[][]=;
for(int i=;i<mod;i++)fac[i]=(fac[i-]*i)%mod;
inv[]=; inv[]=;
for(int i=;i<mod;i++)inv[i]=((mod-mod/i)*inv[mod%i])%mod;//从2开始!
for(int i=;i<mod;i++)inv[i]=(inv[i]*inv[i-])%mod;
for(int i=;i<mod;i++)
{
sum[i][]=; c[i][]=;
if(i)
{
for(int j=;j<mod;j++)
c[i][j]=(c[i-][j]+c[i-][j-])%mod;
}
for(int j=;j<mod;j++)
sum[i][j]=(sum[i][j-]+C(i,j))%mod;
}
}
ll ans(ll n,ll k)
{
if(k<)return ;
return ((ans(n/mod,k/mod-)*sum[n%mod][mod-])%mod
+(Lucas(n/mod,k/mod)*sum[n%mod][k%mod])%mod)%mod;
}
int main()
{
init();
scanf("%lld",&T);
while(T--)
{
scanf("%lld%lld",&n,&k);
printf("%lld\n",ans(n,k));
}
return ;
}
bzoj4591 [Shoi2015]超能粒子炮·改——组合数学(+求阶乘逆元新姿势)的更多相关文章
- bzoj4591 [Shoi2015]超能粒子炮·改
Description 曾经发明了脑洞治疗仪&超能粒子炮的发明家SHTSC又公开了他的新发明:超能粒子炮·改--一种可以发射威力更加 强大的粒子流的神秘装置.超能粒子炮·改相比超能粒子炮,在威 ...
- [bzoj4591][Shoi2015][超能粒子炮·改] (lucas定理+组合计数)
Description 曾经发明了脑洞治疗仪&超能粒子炮的发明家SHTSC又公开了他的新发明:超能粒子炮·改--一种可以发射威力更加 强大的粒子流的神秘装置.超能粒子炮·改相比超能粒子炮,在威 ...
- [BZOJ4591][SHOI2015]超能粒子炮·改(Lucas定理+数位DP)
大组合数取模可以想到Lucas,考虑Lucas的意义,实际上是把数看成P进制计算. 于是问题变成求1~k的所有2333进制数上每一位数的组合数之积. 数位DP,f[i][0/1]表示从高到低第i位,这 ...
- BZOJ4591 SHOI2015超能粒子炮·改(卢卡斯定理+数位dp)
注意到模数很小,容易想到使用卢卡斯定理,即变成一个2333进制数各位组合数的乘积.对于k的限制容易想到数位dp.可以预处理一发2333以内的组合数及组合数前缀和,然后设f[i][0/1]为前i位是否卡 ...
- BZOJ4591——[Shoi2015]超能粒子炮·改
1.题意:求 2.分析:公式恐惧症的同学不要跑啊QAQ 根据lucas定理-- 这一步大家都能懂吧,这是浅而易见的lucas定理转化过程,将每一项拆分成两项 那么下一步,我们将同类项合并 我们观察可以 ...
- bzoj千题计划279:bzoj4591: [Shoi2015]超能粒子炮·改
http://www.lydsy.com/JudgeOnline/problem.php?id=4591 最后的式子合并同类项 #include<cstdio> #include<i ...
- 洛谷 P4345 [SHOI2015]超能粒子炮·改 解题报告
P4345 [SHOI2015]超能粒子炮·改 题意 求\(\sum_{i=0}^k\binom{n}{i}\),\(T\)组数据 范围 \(T\le 10^5,n,j\le 10^{18}\) 设\ ...
- 【BZOJ4591】[SHOI2015]超能粒子炮·改 (卢卡斯定理)
[BZOJ4591][SHOI2015]超能粒子炮·改 (卢卡斯定理) 题面 BZOJ 洛谷 题解 感天动地!终于不是拓展卢卡斯了!我看到了一个模数,它是质数!!! 看着这个东西就感觉可以递归处理. ...
- bzoj4591 / P4345 [SHOI2015]超能粒子炮·改
P4345 [SHOI2015]超能粒子炮·改 题意:求$\sum_{i=1}^{k}C(n,i)\%(P=2333)$ 肯定要先拆开,不然怎么做呢(大雾) 把$C(n,i)$用$lucas$分解一下 ...
随机推荐
- Codeforces 280C - Game on Tree
传送门:280C - Game on Tree 不知道期望是啥的请自行Baidu或Google,(溜了 题目大意,有一棵有根树,每次随机选择一个节点,将这个节点和它的子树删除,问将整棵树删除的期望次数 ...
- <MySQL>入门三 数据定义语言 DDL
-- DDL 数据定义语言 /* 库和表的管理 一.库的管理:创建.修改.删除 二.表的管理:创建.修改.删除 创建:create 修改:alter 删除:drop */ 1.库的管理 -- 库的管理 ...
- C++异常:exception
基本知识 下图表示了标准异常的继承关系 exception是所有标准异常的基类,自定义异常也需要继承exception,如下例: #include "pch.h" #include ...
- javaHttp请求,接收到的是中文乱码如何处理
可在service()方法中加日志,看哪种不是乱码 例如,中文乱码的话,中文编码一般有 UTF-8,GBK,ISO-8859-1 加日志为 List<String> list = new ...
- 使用nfs3将hdfs挂载到本地或远程目录(非kerberos适用)
最基本的配置方法,aix.kerberos等的操作详见http://hadoop.apache.org/docs/current/hadoop-project-dist/hadoop-hdfs/Hdf ...
- AOP基础
[Why AOP ?] 1.代码混乱:越来越多的非业务需求(日志和验证等)加入后,原有的业务方法急剧膨胀.每个方法在处理核心逻辑的同时还必须兼顾其他多个关注点. 2.代码分散:以日志需求为例,知识为了 ...
- 转载 - Vim 的 Python 编辑器详细配置过程 (Based on Ubuntu 12.04 LTS)
出处:http://www.cnblogs.com/ifantastic/p/3185665.html Vim 的 Python 编辑器详细配置过程 (Based on Ubuntu 12.04 LT ...
- Spring @Conditional注解 详细讲解及示例
版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/xcy1193068639/article/details/81491071 前言: @Conditi ...
- 函数式语言(functional language)定义、函数式语言的种类以及为什么函数式语言会流行起来的学习笔记
一.什么是函数式语言? 函数式语言一类程序设计语言,是一种非冯·诺伊曼式的程序设计语言.函数式语言主要成分是原始函数.定义函数和函数型.这种语言具有较强的组织数据结构的能力,可以把某一数据 ...
- Linux查看设备信息命令
系统 #查看内核/操作系统/CPU信息 uname -a #查看操作系统版本 head -n 1 /etc/issue #查看CPU信息 cat /proc/cpuinfo #查看计算机名 hostn ...