bzoj4737: 组合数问题
终于过了肝了一天啊,怎么我最近都在做细节码农题啊
(这种水平NOIP凉凉??)
luacs大家都可以想到用吧,一开始我的思路是把所有在p以内的%p==0的组合数预处理出来,那C(n/p,m/p)任取,但是好像有重算
仔细思考,其实一个组合数可以拆分成很多个C(x%p,y%p) x<y就有是k的倍数,把这个东西看成p进制,得到推论C(i,j)不是p的倍数当且仅当k进制下i的每一位分别大于等于j
#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long LL;
const LL mod=1e9+; int alen,a[],blen,b[];
LL S(LL x){return x%=mod,x*(x+)/%mod;}
LL cal(LL a,LL b)
{
if(a<b)b=a;
return (S(a)-S(a-b))%mod;
}
LL f[][][];//第i个位,是否在n的上界边缘,是否在m的上界边缘,每一位i都大于等于j的方案数
int main()
{
freopen("a.in","r",stdin);
freopen("a.out","w",stdout);
int T,K;
scanf("%d%d",&T,&K);
while(T--)
{
LL n,m,k;
scanf("%lld%lld",&n,&m);if(n<m)m=n;
alen=,k=n;while(k>)a[++alen]=k%K,k/=K;
blen=,k=m;while(k>)b[++blen]=k%K,k/=K;
for(int i=blen+;i<=alen;i++)b[i]=; int len=alen;
memset(f,,sizeof(f));
for(int u=;u<=a[len];u++)
for(int v=;v<=b[len];v++)
{
if(u>=v)
{
if(u==a[len]&&v==b[len])f[len][][]++;
else if(u==a[len])f[len][][]++;
else if(v==b[len])f[len][][]++;
else f[len][][]++;
}
}
int c;
for(int i=len-;i>=;i--)
{
c=;
for(int u=;u<K;u++)
for(int v=;v<K;v++)
{
if(u>=v)
{
if(u<a[i])
{
if(v<b[i])
{
c++;
f[i][][]=(f[i][][]+f[i+][][]+f[i+][][]+f[i+][][]+f[i+][][])%mod;
}
if(v==b[i])
{
f[i][][]=(f[i][][]+f[i+][][]+f[i+][][])%mod;
f[i][][]=(f[i][][]+f[i+][][]+f[i+][][])%mod;
}
if(v>b[i])
{
f[i][][]=(f[i][][]+f[i+][][]+f[i+][][])%mod;
}
}
if(u==a[i])
{
if(v<b[i])
{
f[i][][]=(f[i][][]+f[i+][][]+f[i+][][])%mod;
f[i][][]=(f[i][][]+f[i+][][]+f[i+][][])%mod;
}
if(v==b[i])
{
f[i][][]=(f[i][][]+f[i+][][])%mod;
f[i][][]=(f[i][][]+f[i+][][])%mod;
f[i][][]=(f[i][][]+f[i+][][])%mod;
f[i][][]=(f[i][][]+f[i+][][])%mod;
}
if(v>b[i])
{
f[i][][]=(f[i][][]+f[i+][][])%mod;
f[i][][]=(f[i][][]+f[i+][][])%mod;
}
}
if(u>a[i])
{
if(v<b[i])
{
f[i][][]=(f[i][][]+f[i+][][]+f[i+][][])%mod;
}
if(v==b[i])
{
f[i][][]=(f[i][][]+f[i+][][])%mod;
f[i][][]=(f[i][][]+f[i+][][])%mod;
}
if(v>b[i])
{
f[i][][]=(f[i][][]+f[i+][][])%mod;
}
}
}
}
} LL ans=cal(n+,m+);
for(int i=;i<=;i++)
for(int j=;j<=;j++)
ans=(ans-f[][i][j])%mod;
printf("%lld\n",(ans+mod)%mod);
}
return ;
}
bzoj4737: 组合数问题的更多相关文章
- BZOJ4737 组合数问题(卢卡斯定理+数位dp)
不妨不管j<=i的限制.由卢卡斯定理,C(i,j) mod k=0相当于k进制下存在某位上j大于i.容易想到数位dp,即设f[x][0/1][0/1][0/1]为到第x位时是否有某位上j> ...
- BZOJ4737 组合数问题 【Lucas定理 + 数位dp】
题目 组合数C(n,m)表示的是从n个物品中选出m个物品的方案数.举个例子,从(1,2,3)三个物品中选择两个物品可以有( 1,2),(1,3),(2,3)这三种选择方法.根据组合数的定义,我们可以给 ...
- 2018.10.31 bzoj4737: 组合数问题(lucas定理+容斥原理+数位dp)
传送门 这是一道让我重新认识lucaslucaslucas的题. 考虑到lucaslucaslucas定理: (nm)≡(n%pm%p)∗(npmp)\binom n m \equiv \binom ...
- [UOJ 275/BZOJ4737] 【清华集训2016】组合数问题 (LUCAS定理的运用+数位DP)
题面 传送门:UOJ Solution 这题的数位DP好蛋疼啊qwq 好吧,我们说回正题. 首先,我们先回忆一下LUCAS定理: \(C_n^m \equiv C_{n/p}^{m/p} \times ...
- LCM性质 + 组合数 - HDU 5407 CRB and Candies
CRB and Candies Problem's Link Mean: 给定一个数n,求LCM(C(n,0),C(n,1),C(n,2)...C(n,n))的值,(n<=1e6). analy ...
- 计算一维组合数的java实现
背景很简单,就是从给定的m个不同的元素中选出n个,输出所有的组合情况! 例如:从1到m的自然数中,选择n(n<=m)个数,有多少种选择的组合,将其输出! 本方案的代码实现逻辑是比较成熟的方案: ...
- Noip2016提高组 组合数问题problem
Day2 T1 题目大意 告诉你组合数公式,其中n!=1*2*3*4*5*...*n:意思是从n个物体取出m个物体的方案数 现给定n.m.k,问在所有i(1<=i<=n),所有j(1< ...
- C++单元测试 之 gtest -- 组合数计算.
本文将介绍如何使用gtest进行单元测试. gtest是google单元测试框架.使用非常方便. 首先,下载gtest (有些google项目包含gtest,如 protobuf),复制目录即可使用. ...
- NOIP2011多项式系数[快速幂|组合数|逆元]
题目描述 给定一个多项式(by+ax)^k,请求出多项式展开后x^n*y^m 项的系数. 输入输出格式 输入格式: 输入文件名为factor.in. 共一行,包含5 个整数,分别为 a ,b ,k , ...
随机推荐
- Java&Xml教程(六)使用JDOM解析XML文件
JDOM 提供了非常优秀的Java XML API来更方便的读取.修改.生成XML文档.JDOM还提供了包装类供用户从SAX.DOM.STAX事件解析.STAX流解析中选择具体的实现. 在本教程中,我 ...
- html5——表单
type类型 email //输入email格式 tel //手机号码 url //只能输入url格式 number //只能输入数字 search //搜索框 range //范围 滑动条 colo ...
- ProE复杂曲线方程:Python Matplotlib 版本代码(L系统,吸引子和分形)
对生长自动机的研究由来已久,并在计算机科学等众多学科中,使用元胞自动机的概念,用于生长模拟.而复杂花纹的生成,则可以通过重写一定的生长规则,使用生成式来模拟自然纹理.当然,很多纹理是由人本身设计的,其 ...
- phpCURL抓取网页内容
参考代码1:<?php // 创建一个新cURL资源 $ch = curl_init(); // 设置URL和相应的选项 curl_setopt($ch, CURLOPT_URL, " ...
- SetACL 使用方法详细参数中文解析
示例: SetACL.exe c:\nihao /dir /deny everyone /read_ex 设置E:\wxDesktop 文件夹 everyone 用户为读取和运行权限 SetACL M ...
- select2下拉插件
下拉单选: 1.行内 1)初始化数据: <select class="form-control select5"> <option selected>张三1 ...
- 解决fixed在苹果手机抖动问题/头部底部固定布局
1.头部和底部固定,中间内容滚动,不涉及fixed 1)absolute与height:100% <!DOCTYPE html><html><head> <m ...
- js的三种对象
JS中,可以将对象分为“内部对象”.“宿主对象”和“自定义对象”三种. 1,内部对象 js中的内部对象包括Array.Boolean.Date.Function.Global.Math.Number. ...
- java的四种引用,强弱软虚和jvm优化
1.强引用(StrongReference)强引用是使用最普遍的引用.如果一个对象具有强引用,那垃圾回收器绝不会回收它.如下: Object o=new Object(); // 强引用 当内存 ...
- IDEA 创建一个普通的java项目
IntelliJ IDEA 如何创建一个普通的java项目,及创建java文件并运行 首先,确保idea软件正确安装完成,java开发工具包jdk安装完成. IntelliJ IDEA下载地址:htt ...