UOJ 275. 【清华集训2016】组合数问题

组合数 $C_n^m $表示的是从 \(n\) 个物品中选出 \(m\) 个物品的方案数。举个例子,从$ (1,2,3)(1,2,3)$ 三个物品中选择两个物品可以有 \((1,2),(1,3),(2,3)\) 这三种选择方法。根据组合数的定义,我们可以给出计算组合数$ C_m^n$的一般公式:

\[C_n^m=\frac{n!}{m!(n-m)!}
\]

其中 \(n!=1×2×⋯×n\)。(额外的,当 n=0n=0 时, n!=1n!=1)

小葱想知道如果给定$ n,m$ 和 \(k\),对于所有的 \(0≤i≤n,0≤j≤\min\{i,m\}\)有多少对 \((i,j)\) 满足 \(C_i^j\)是 \(k\) 的倍数。

答案对 \(10^9+7\) 取模。

输入格式

第一行有两个整数 \(t,k\)其中 \(t\) 代表该测试点总共有多少组测试数据。

接下来 \(t\) 行每行两个整数 \(n,m\)。

输出格式

\(t\) 行,每行一个整数代表所有的 \(0\leq i\leq n,0\leq j\leq \min \left \{ i, m \right \}\) 中有多少对$ (i,j)\(满足\)C_i^j$是 \(k\) 的倍数。

限制与约定

对于\(100\%\) 的测试点, \(1\leq n,m\leq 10^{18},1 \leq t,k\leq 100\),且 \(k\) 是一个质数。

\(\\\)

首先考虑使用卢卡斯定理:

\[\text{Lucas}(n,m)\bmod k=\text{Lucas}(\frac{n}{k},\frac{m}{k})\cdot\binom{n\%k}{m\%k}\bmod k
\]

迭代过程中只要有一位上的\(\binom{n\%k}{m\%k}=0\)那么最后的组合数就是\(k\)的倍数。当\(n<k,m<k\)时,只有\(n<m\)的情况下:\(\binom{n}{m}=0\)。

我们将\(n,m\)写成\(k\)进制的数,然后做数位\(DP\)。先不考虑\(j\leq i\)的限制的话要好做一些,然后在减掉\(j>i\)的情况(这部分显然为0)就好了。

代码(小心爆\(long\ long\)):

#include<bits/stdc++.h>
#define ll long long using namespace std;
inline ll Get() {ll x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9') {if(ch=='-') f=-1;ch=getchar();}while('0'<=ch&&ch<='9') {x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}return x*f;} const ll mod=1e9+7;
ll n,m,k;
ll A[100],B[100]; int d;
#define pr pair<ll,ll>
#define mp(a,b) make_pair(a,b) pr f[100][2][2];
pr dfs(int v,int flag1,int flag2) {
if(v<0) return mp(0,1);
if(f[v][flag1][flag2].first!=-1) return f[v][flag1][flag2];
int u1=(!flag1)?k-1:A[v],u2=(!flag2)?k-1:B[v];
ll ans0=0,ans1=0;
pr now;
for(int i=0;i<=u1;i++) {
for(int j=0;j<=u2;j++) {
now=dfs(v-1,flag1&&i==u1,flag2&&j==u2);
if(i<j) {
(ans0+=1ll*now.first+now.second)%=mod;
} else {
(ans0+=now.first)%=mod;
(ans1+=now.second)%=mod;
}
}
}
f[v][flag1][flag2]=mp(ans0,ans1);
return mp(ans0,ans1);
} ll cal(ll l,ll r) {return 1ll*(l+r)*(r-l+1)/2%mod;} int main() {
int T=Get();
k=Get();
while(T--) {
n=Get(),m=Get();
d=0;
ll mx=max(n,m);
while(mx) {
d++;
mx/=k;
}
d--;
ll x=n;
for(int i=0;i<=d;i++) {
A[i]=x%k;
x/=k;
}
x=m;
for(int i=0;i<=d;i++) {
B[i]=x%k;
x/=k;
}
for(int i=0;i<=d;i++)
for(int a=0;a<=1;a++)
for(int b=0;b<=1;b++) f[i][a][b]=mp(-1,-1);
pr ans=dfs(d,1,1);
ans.first=(ans.first-cal(max(1ll,m-n)%mod,m%mod)+mod)%mod;
cout<<ans.first<<"\n";
}
return 0;
}

UOJ 275. 【清华集训2016】组合数问题的更多相关文章

  1. [UOJ#274][清华集训2016]温暖会指引我们前行

    [UOJ#274][清华集训2016]温暖会指引我们前行 试题描述 寒冬又一次肆虐了北国大地 无情的北风穿透了人们御寒的衣物 可怜虫们在冬夜中发出无助的哀嚎 “冻死宝宝了!” 这时 远处的天边出现了一 ...

  2. UOJ275 [清华集训2016] 组合数问题 【Lucas定理】【数位DP】

    题目分析: 我记得很久以前有人跟我说NOIP2016的题目出了加强版在清华集训中,但这似乎是一道无关的题目? 由于$k$为素数,那么$lucas$定理就可以搬上台面了. 注意到$\binom{i}{j ...

  3. BZOJ 4732 UOJ #268 [清华集训2016]数据交互 (树链剖分、线段树)

    题目链接 (BZOJ) https://www.lydsy.com/JudgeOnline/problem.php?id=4732 (UOJ) http://uoj.ac/problem/268 题解 ...

  4. [UOJ#276][清华集训2016]汽水[分数规划+点分治]

    题意 给定一棵 \(n\) 个点的树,给定 \(k\) ,求 \(|\frac{\sum w(路径长度)}{t(路径边数)}-k|\)的最小值. \(n\leq 5\times 10^5,k\leq ...

  5. UOJ #269. 【清华集训2016】如何优雅地求和

    UOJ #269. [清华集训2016]如何优雅地求和 题目链接 给定一个\(m\)次多项式\(f(x)\)的\(m+1\)个点值:\(f(0)\)到\(f(m)\). 然后求: \[ Q(f,n,x ...

  6. [UOJ#276]【清华集训2016】汽水

    [UOJ#276][清华集训2016]汽水 试题描述 牛牛来到了一个盛产汽水的国度旅行. 这个国度的地图上有 \(n\) 个城市,这些城市之间用 \(n−1\) 条道路连接,任意两个城市之间,都存在一 ...

  7. UOJ #274. 【清华集训2016】温暖会指引我们前行 [lct]

    #274. [清华集训2016]温暖会指引我们前行 题意比较巧妙 裸lct维护最大生成树 #include <iostream> #include <cstdio> #incl ...

  8. UOJ_274_[清华集训2016]温暖会指引我们前行_LCT

    UOJ_274_[清华集训2016]温暖会指引我们前行_LCT 任务描述:http://uoj.ac/problem/274 本题中的字典序不同在于空串的字典序最大. 并且题中要求排序后字典序最大. ...

  9. [清华集训2016]温暖会指引我们前行——LCT+最大生成树

    题目链接: [清华集训2016]温暖会指引我们前行 题目大意:有$n$个点$m$次操作,每次操作分为三种:1.在$u,v$两点之间连接一条编号为$id$,长度为$l$,温度为$t$的边.2.查询从$u ...

随机推荐

  1. 使用async await 封装 axios

    异步变同步: 厉害-- https://www.jianshu.com/p/4168efdc172b

  2. elasticsearch常用命令备注

    1.检查集群健康状态 curl 'localhost:9200/_cat/health?v' 2.检查节点健康状态 curl 'localhost:9200/_cat/nodes?v' 3.新增一条索 ...

  3. 统一修改表单参数(表单提交的空字符串统一转null)

    统一修改表单参数(表单提交的空字符串统一转null) 1.介绍: 我们业务中有时会遇到提交的表单中某个参数为空字符串,导致后台接受的为空字符串("")而不是我们理想中的null,会 ...

  4. 磁盘阵列raid类型及含义

    raid0: 多块盘同时进行读写: 优点是读写效率高,缺点是没有数据冗余: 最少需要两块盘. raid1: 将数据盘都做镜像: 优点是有数据冗余:缺点是读写效率低,磁盘利用率低: 最少需要两块盘. r ...

  5. 第1章 程序设计和C语言

    1.1什么是计算机程序 程序,就是一组计算机能识别和执行的指令.每一条指令使计算机执行特定的操作.只要让计算机执行这个程序,计算机就会“自动地”执行各条指令,有条不紊地进行工作. 1.2什么是计算机语 ...

  6. 在Linux系统配置Nodejs环境的最简单步骤,部署多个thinkjs(nodejs)项目

    发现一台服务器部署管理多个nodejs服务,可以采用二级域名weekly.mwcxs.top,也可以采用固定后缀www.mwcxs.top/weekly的方式,本文先从固定后缀的方式部署管理多个nod ...

  7. 【Java】留下没有基础眼泪的面试题

    前言 只有光头才能变强 本文力求简单讲清每个知识点,希望大家看完能有所收获 一.如何减少线程上下文切换 使用多线程时,不是多线程能提升程序的执行速度,使用多线程是为了更好地利用CPU资源! 程序在执行 ...

  8. leetcode 链表类型题目解题总结

    最基础的方式要做到非常熟练,要熟练到不思考就能写,但又需明白各处的要求和陷阱 合并两个有序链表的操作,在前面加上一个初始节点,注意while循环和退出时的处理,理解如何处理其中一个链表遍历完的情况 L ...

  9. 卷积神经网络CNN

    卷积神经网络,在图像识别和自然语言处理中有很大的作用,讲cnn的中文博客也不少,但是个人感觉说的脉络清晰清晰易懂的不多. 无意中看到这篇博客,写的很好,图文并茂.建议英文好的直接去看原文.英文不好的就 ...

  10. c#导出文件,文件名中文乱码解决方法

    public string clFielName(string fileName) { System.Web.HttpContext curContext = System.Web.HttpConte ...