bzoj 4737: 组合数问题
Description
组合数C(n,m)表示的是从n个物品中选出m个物品的方案数。举个例子,从(1,2,3)三个物品中选择两个物品可以有(
Input
Output
t行,每行一个整数代表所有的0≤i≤n,0≤j≤min(i,m)中有多少对(i,j))满足C(i,j)是k的倍数
由lucas定理的推论,C(i,j)不是k的倍数当且仅当k进制下i的每一位分别>=j
先补上前导零使n,m位数相同从高位到低位进行数位dp,f[i][0/1][0/1]表示当前已决策高于第i位的部分,已决策部分是否与n,m相等,满足条件的方案数。
#include<cstdio>
#include<cstring>
const int P=;
typedef long long i64;
int T,k,ns[],ms[],f[][][];
i64 n,m;
int min(int a,int b){return a<b?a:b;}
int max(int a,int b){return a>b?a:b;}
i64 S(i64 x){return x%=P,x*(x+)/%P;}
i64 cal(i64 a,i64 b){
if(a<b)b=a;
return (S(a)-S(a-b))%P;
}
i64 s[][];
int main(){
scanf("%d%d",&T,&k);
for(int i=;i<=k;++i)
for(int j=;j<=k;++j)s[i][j]=cal(i,j);
for(;T;--T){
scanf("%lld%lld",&n,&m);
if(n<m)m=n;
int ans=cal(n+,m+);
int np=,mp=;
while(n)ns[++np]=n%k,n/=k;
while(m)ms[++mp]=m%k,m/=k;
while(mp<np)ms[++mp]=;
memset(f,,sizeof(f));
f[np][][]=;
for(int i=np;i;--i){
int(*F)[]=f[i],(*G)[]=f[i-];
int vn=ns[i],vm=ms[i];
G[][]=F[][]*(vn>=vm);
G[][]=(F[][]*i64(vn+)+F[][]*(i64)min(vn+,vm))%P;
G[][]=(F[][]*i64(k-vm)+F[][]*(i64)max(vn-vm,))%P;
G[][]=(F[][]*s[k][k]+F[][]*s[k][vm]+F[][]*s[vn][k]+F[][]*s[vn][vm])%P;
}
for(int a=;a<;++a)
for(int b=;b<;++b)
ans=(ans-f[][a][b])%P;
printf("%d\n",(ans+P)%P);
}
return ;
}
bzoj 4737: 组合数问题的更多相关文章
- [BZOJ 4870] 组合数问题
Link: 传送门 Solution: 组合数的式子都可以先想想能不能递推,写出来就是: $\sum C_{n*k}^{i*k+r}=\sum C_{n*k-1}^{i*k+r}+\sum C_{n* ...
- BZOJ 4517 组合数+错排
思路: 预处理错排 然后C(n,m)*s[n-m-1]就是答案了 特判n-m-1<0 //By SiriusRen #include <cstdio> using namespace ...
- [UOJ 275/BZOJ4737] 【清华集训2016】组合数问题 (LUCAS定理的运用+数位DP)
题面 传送门:UOJ Solution 这题的数位DP好蛋疼啊qwq 好吧,我们说回正题. 首先,我们先回忆一下LUCAS定理: \(C_n^m \equiv C_{n/p}^{m/p} \times ...
- 清明 DAY 3
ans=1000*4 分别固定千位,百位,十位,个位为1,其余位置随便排 对于每一个质因数的n次方,共有n+1中选择方法,即这个质因数的0~n次方 故共有 4*3*5=60 种方法 (1)取两册 ...
- [BZOJ 3129] [Sdoi2013] 方程 【容斥+组合数取模+中国剩余定理】
题目链接:BZOJ - 3129 题目分析 使用隔板法的思想,如果没有任何限制条件,那么方案数就是 C(m - 1, n - 1). 如果有一个限制条件是 xi >= Ai ,那么我们就可以将 ...
- Bzoj 1856: [Scoi2010]字符串 卡特兰数,乘法逆元,组合数,数论
1856: [Scoi2010]字符串 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 1194 Solved: 651[Submit][Status][ ...
- bzoj 4870: [Shoi2017]组合数问题 [矩阵乘法优化dp]
4870: [Shoi2017]组合数问题 题意:求 \[ \sum_{i=0}^{n-1} \binom{nk}{ik+r} \mod p \] \(n \le 10^9, 0\le r < ...
- BZOJ 2159: Crash 的文明世界(树形dp+第二类斯特林数+组合数)
题意 给定一棵 \(n\) 个点的树和一个常数 \(k\) , 对于每个 \(i\) , 求 \[\displaystyle S(i) = \sum _{j=1} ^ {n} \mathrm{dist ...
- bzoj千题计划263:bzoj4870: [六省联考2017]组合数问题
http://www.lydsy.com/JudgeOnline/problem.php?id=4870 80分暴力打的好爽 \(^o^)/~ 预处理杨辉三角 令m=n*k 要求满足m&x== ...
随机推荐
- 用conda管理Python包
用conda管理Python包 conda是一个很好的包管理工具,在用了Anaconda之后一直不知道怎么用conda进行管理,其实很简单,就是没人教,慢慢自己摸索了一点.直接在Anaconda的命令 ...
- 边框回归(Bounding Box Regression)详解
原文地址:http://blog.csdn.net/zijin0802034/article/details/77685438 Bounding-Box regression 最近一直看检测有关的Pa ...
- mysql安装与卸载(阿里云)
1.安装rpm包rpm -Uvh http://dev.mysql.com/get/mysql-community-release-el7-5.noarch.rpm 2.安装mysqlyum -y i ...
- @RequestBody,@ResponseBody
@RequestBody 作用: i) 该注解用于读取Request请求的body部分数据,使用系统默认配置的HttpMessageConverter进行解析,然后把相应的数据绑定到要返回的对象上: ...
- sql 学习
.查看表结构用desc desc emp; 2.空表dual,最常用的空表,如: select 2 * 4 from dual; select sysdate from dual; 3.双引号 ...
- oracle ip 改为 机器名
1 hosts文件 添加 ip 机器名 这一行 2 修改listner.ora 和tnsora.ora ip改为机器名 3 重启服务
- Vue.js——常用的指令
1.v-on:指令监听DOM事件,并在触发时运行一些javaScript代码. <div id='myView'> <img src="img/se.png" v ...
- saltstack自动化运维系列⑤之saltstack的配置管理详解
saltstack自动化运维系列⑤之saltstack的配置管理详解 配置管理初始化: a.服务端配置vim /etc/salt/master file_roots: base: - /srv/sal ...
- svn使用小技巧
在使用svn的时候,往往导入到eclipse中,使用eclipse进行提交修改,但是当删除文件夹的时候,eclipse会发生冲突,不能够提交. 使用一种方式,将svn上的项目跟你eclipse对应项目 ...
- Android:注册登录
注册登录的实现 先在layout里新建一个xml文件: //login.xml <?xml version="1.0" encoding="utf-8"? ...