UOJ 275. 【清华集训2016】组合数问题
UOJ 275. 【清华集训2016】组合数问题
组合数 $C_n^m $表示的是从 \(n\) 个物品中选出 \(m\) 个物品的方案数。举个例子,从$ (1,2,3)(1,2,3)$ 三个物品中选择两个物品可以有 \((1,2),(1,3),(2,3)\) 这三种选择方法。根据组合数的定义,我们可以给出计算组合数$ C_m^n$的一般公式:
\]
其中 \(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\) 是一个质数。
\(\\\)
首先考虑使用卢卡斯定理:
\]
迭代过程中只要有一位上的\(\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】组合数问题的更多相关文章
- [UOJ#274][清华集训2016]温暖会指引我们前行
[UOJ#274][清华集训2016]温暖会指引我们前行 试题描述 寒冬又一次肆虐了北国大地 无情的北风穿透了人们御寒的衣物 可怜虫们在冬夜中发出无助的哀嚎 “冻死宝宝了!” 这时 远处的天边出现了一 ...
- UOJ275 [清华集训2016] 组合数问题 【Lucas定理】【数位DP】
题目分析: 我记得很久以前有人跟我说NOIP2016的题目出了加强版在清华集训中,但这似乎是一道无关的题目? 由于$k$为素数,那么$lucas$定理就可以搬上台面了. 注意到$\binom{i}{j ...
- BZOJ 4732 UOJ #268 [清华集训2016]数据交互 (树链剖分、线段树)
题目链接 (BZOJ) https://www.lydsy.com/JudgeOnline/problem.php?id=4732 (UOJ) http://uoj.ac/problem/268 题解 ...
- [UOJ#276][清华集训2016]汽水[分数规划+点分治]
题意 给定一棵 \(n\) 个点的树,给定 \(k\) ,求 \(|\frac{\sum w(路径长度)}{t(路径边数)}-k|\)的最小值. \(n\leq 5\times 10^5,k\leq ...
- UOJ #269. 【清华集训2016】如何优雅地求和
UOJ #269. [清华集训2016]如何优雅地求和 题目链接 给定一个\(m\)次多项式\(f(x)\)的\(m+1\)个点值:\(f(0)\)到\(f(m)\). 然后求: \[ Q(f,n,x ...
- [UOJ#276]【清华集训2016】汽水
[UOJ#276][清华集训2016]汽水 试题描述 牛牛来到了一个盛产汽水的国度旅行. 这个国度的地图上有 \(n\) 个城市,这些城市之间用 \(n−1\) 条道路连接,任意两个城市之间,都存在一 ...
- UOJ #274. 【清华集训2016】温暖会指引我们前行 [lct]
#274. [清华集训2016]温暖会指引我们前行 题意比较巧妙 裸lct维护最大生成树 #include <iostream> #include <cstdio> #incl ...
- UOJ_274_[清华集训2016]温暖会指引我们前行_LCT
UOJ_274_[清华集训2016]温暖会指引我们前行_LCT 任务描述:http://uoj.ac/problem/274 本题中的字典序不同在于空串的字典序最大. 并且题中要求排序后字典序最大. ...
- [清华集训2016]温暖会指引我们前行——LCT+最大生成树
题目链接: [清华集训2016]温暖会指引我们前行 题目大意:有$n$个点$m$次操作,每次操作分为三种:1.在$u,v$两点之间连接一条编号为$id$,长度为$l$,温度为$t$的边.2.查询从$u ...
随机推荐
- The operation could not be performed because OLE DB provider "SQLNCLI11" for linked server "SDSSDFCC" was unable to begin a distributed transaction.
Question: SQL SERVER 通过Linkserver连接A和B 2台,A对B执行单条的增删改查没有异常(没有配置DTC) 但是开启事务后就会出现报错 Solution: 在A和B上配置D ...
- 如何修复使用WSUS进行升级Win 10 更新1809的报错(0x8024200)
备注:该文档有另一个姊妹篇,介绍如何修复下游服务器一直有处于需要文件下载的状况. /* Style Definitions */ table.MsoNormalTable {mso-style-nam ...
- MySQL 查询重复数据,删除重复数据保留id最小的一条作为唯一数据
开发背景: 最近在做一个批量数据导入到MySQL数据库的功能,从批量导入就可以知道,这样的数据在插入数据库之前是不会进行重复判断的,因此只有在全部数据导入进去以后在执行一条语句进行删除,保证数据唯一性 ...
- C#类型(一)
1.System.Object C#的所有类型都是派生自System.Object 也就是说下面的两个类型定义完全一致 // 隐式派生自Object public class Person{ } { ...
- SpringBoot之GZip压缩,HTTP/2,文件上传,缓存配置
1 设置应用端口以及context # HTTP Server port server.port=8080 # Make the application accessible on the given ...
- Win32对话框程序(2)
接着Win32对话框程序(1)来写 ,解决遗留的问题,即理解函数及其调用关系.文章中有些地方是自己的推断,因此肯定有叙述不准确甚至错误的地方,请指正,感谢~ ********************* ...
- SQL优化 MySQL版 - 多表优化及细节详讲
多表优化及细节详讲 作者 : Stanley 罗昊 [转载请注明出处和署名,谢谢!] 注:本文章需要MySQL数据库优化基础或观看前几篇文章,传送门: B树索引详讲(初识SQL优化,认识索引):htt ...
- 【Tomcat】Tomcat工作原理及简单模拟实现
Tomcat应该都不陌生,我们经常会把写好的代码打包放在Tomcat里并启动,然后在浏览器里就能愉快的调用我们写的代码来实现相应的功能了,那么Tomcat是如何工作的? 一.Tomcat工作原理 我们 ...
- mysql生成日期的辅助表
为了解决mysql按日期分组查询统计的时候,没有数据补0.可以生成连续的时间表格来辅助查询* 生成按天的数据 * 每一个小时为一个分段 生成如下辅助表 *代码如下 CREATE TABLE num ( ...
- html 微信video放大后无法返回问题
android video播放视频放大后无法返回,先debug下debugx5.qq.com 发现用的不是X5内核 直接激活 debugmm.qq.com/?forcex5=true 问题解决 ...