终于过了肝了一天啊,怎么我最近都在做细节码农题啊

(这种水平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: 组合数问题的更多相关文章

  1. BZOJ4737 组合数问题(卢卡斯定理+数位dp)

    不妨不管j<=i的限制.由卢卡斯定理,C(i,j) mod k=0相当于k进制下存在某位上j大于i.容易想到数位dp,即设f[x][0/1][0/1][0/1]为到第x位时是否有某位上j> ...

  2. BZOJ4737 组合数问题 【Lucas定理 + 数位dp】

    题目 组合数C(n,m)表示的是从n个物品中选出m个物品的方案数.举个例子,从(1,2,3)三个物品中选择两个物品可以有( 1,2),(1,3),(2,3)这三种选择方法.根据组合数的定义,我们可以给 ...

  3. 2018.10.31 bzoj4737: 组合数问题(lucas定理+容斥原理+数位dp)

    传送门 这是一道让我重新认识lucaslucaslucas的题. 考虑到lucaslucaslucas定理: (nm)≡(n%pm%p)∗(npmp)\binom n m \equiv \binom ...

  4. [UOJ 275/BZOJ4737] 【清华集训2016】组合数问题 (LUCAS定理的运用+数位DP)

    题面 传送门:UOJ Solution 这题的数位DP好蛋疼啊qwq 好吧,我们说回正题. 首先,我们先回忆一下LUCAS定理: \(C_n^m \equiv C_{n/p}^{m/p} \times ...

  5. 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 ...

  6. 计算一维组合数的java实现

    背景很简单,就是从给定的m个不同的元素中选出n个,输出所有的组合情况! 例如:从1到m的自然数中,选择n(n<=m)个数,有多少种选择的组合,将其输出! 本方案的代码实现逻辑是比较成熟的方案: ...

  7. Noip2016提高组 组合数问题problem

    Day2 T1 题目大意 告诉你组合数公式,其中n!=1*2*3*4*5*...*n:意思是从n个物体取出m个物体的方案数 现给定n.m.k,问在所有i(1<=i<=n),所有j(1< ...

  8. C++单元测试 之 gtest -- 组合数计算.

    本文将介绍如何使用gtest进行单元测试. gtest是google单元测试框架.使用非常方便. 首先,下载gtest (有些google项目包含gtest,如 protobuf),复制目录即可使用. ...

  9. NOIP2011多项式系数[快速幂|组合数|逆元]

    题目描述 给定一个多项式(by+ax)^k,请求出多项式展开后x^n*y^m 项的系数. 输入输出格式 输入格式: 输入文件名为factor.in. 共一行,包含5 个整数,分别为 a ,b ,k , ...

随机推荐

  1. javascript DOM编程艺术 第10章问题记录

    为什么moveElement函数调用时,必须加字符串的拼接符 var repeat = "moveElement('"+elementID+"',"+final ...

  2. Echarts 出现不明竖线解决方案

    Echarts出现了不明竖线,百思不得其解.去查相应的解决方案也没有找到. 后来自己点来点去,突然感觉像是上一个Echarts遗留的. 然后去Echarts官网看到了 clear()方法,这个方法可以 ...

  3. (转) 分布式文件存储FastDFS(一)初识FastDFS

    http://blog.csdn.net/xingjiarong/article/details/50559849 一.FastDFS简介 FastDFS是一款开源的.分布式文件系统(Distribu ...

  4. Java数组数据类型

    Java数组数据类型 数组是多个相同类型的数据的组合,数组中的元素可以是任何类型的数据: 一维数组 package com.ahabest.array; public class ArratTest ...

  5. 取三级分销上下级用户id

    //取上三级的用户idpublic function _get_up_third_id($member_id){ $up_id=array(); $invite_id=dbselect('invite ...

  6. linu学习第一天:基础知识

    1 bc 计算器 2 ibase=2 以二进制输入,输出10进制 3 obase=2 输出二进制 4 enable --查看内部命令 5 #第一天的命令 6 enable --查看内部命令 7 ena ...

  7. Linux之iptables(三、命令--->单主机)

    iptables命令规则格式: iptables [-t table] SUBCOMMAND chain [-m matchname[per-match-options]] -j targetname ...

  8. Python OS & sys模块

    os模块(* * * *) os模块是与操作系统交互的一个接口 os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径 os.chdir("dirname" ...

  9. 53. Maximum Subarray(动态规划)

    Find the contiguous subarray within an array (containing at least one number) which has the largest ...

  10. 3.2.1 for循环与while循环的基本语法

    不停地重复一件事情,时间久了会非常无聊,然后大脑就会由于疲劳而容易入睡. 重复性的劳动会使人疲劳,而计算机不会,只要代码写得正确,计算机就会孜孜不倦地重复工作.在Python中主要有两种形式的循环结构 ...