传送门

假设有\(k|{n\choose m}\),因为\(n!\)中质因子\(k\)的次数为\(S(n)=\left\lfloor\frac{n}{k}\right\rfloor+\left\lfloor\frac{n}{k^2}\right\rfloor+...\),而\(m!\)和\((n-m)!\)同理。所以如果\(S(n)>S(m)+S(n-m)\),那么\(k|{n\choose m}\)

不难发现,对于每一个\(k^i\),\(\left\lfloor\frac{n}{k^i}\right\rfloor\geq \left\lfloor\frac{m}{k^i}\right\rfloor+\left\lfloor\frac{n-m}{k^i}\right\rfloor\)。所以只要有一个\(i\)使得\(\left\lfloor\frac{n}{k^i}\right\rfloor>\left\lfloor\frac{m}{k^i}\right\rfloor+\left\lfloor\frac{n-m}{k^i}\right\rfloor\),那么\(S(n)>S(m)+S(n-m)\)

当\(i=1\)的时候,设\(n=ak+b,m=ck+d\),则\(n-m=(a-c)k+b-d\),那么如果\(b-d<0\),\(\left\lfloor\frac{n}{k}\right\rfloor=a,\left\lfloor\frac{m}{k}\right\rfloor+\left\lfloor\frac{n-m}{k}\right\rfloor=c+(a-c-1)=a-1<a\),那么就有\(S(n)>S(m)+S(n-m)\)

同理可得,若\(n\)和\(m\)的\(k\)进制表示下第\(i\)位满足\(n_i<m_i\),那么就有\(S(n)>S(m)+S(n-m)\)

于是现在的问题就是变成了求\(i<n,j<m\)且\(i\)的\(k\)进制表示下有某一位数值比\(j\)小,可以数位dp,这个就不讲了

然后上面的情况下我们没有考虑\(j>i\)的情况,因为如果\(j>i\)那么\(k\)进制下\(i\)肯定有某一位小于\(j\),所以我们对于每个\(i\)算出它会多算的个数,发现就是一个等差数列求和的形式,带公式就好了

//minamoto
#include<bits/stdc++.h>
#define R register
#define ll long long
#define fp(i,a,b) for(R int i=a,I=b+1;i<I;++i)
#define fd(i,a,b) for(R int i=a,I=b-1;i>I;--i)
#define go(u) for(int i=head[u],v=e[i].v;i;i=e[i].nx,v=e[i].v)
using namespace std;
char buf[1<<21],*p1=buf,*p2=buf;
inline char getc(){return p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++;}
ll read(){
R ll res,f=1;R char ch;
while((ch=getc())>'9'||ch<'0')(ch=='-')&&(f=-1);
for(res=ch-'0';(ch=getc())>='0'&&ch<='9';res=res*10+ch-'0');
return res*f;
}
char sr[1<<21],z[20];int C=-1,Z=0;
inline void Ot(){fwrite(sr,1,C+1,stdout),C=-1;}
void print(R int x){
if(C>1<<20)Ot();if(x<0)sr[++C]='-',x=-x;
while(z[++Z]=x%10+48,x/=10);
while(sr[++C]=z[Z],--Z);sr[++C]='\n';
}
const int N=65,P=1e9+7,inv=500000004;
inline int add(R int x,R int y){return x+y>=P?x+y-P:x+y;}
inline int dec(R int x,R int y){return x-y<0?x-y+P:x-y;}
inline int mul(R int x,R int y){return 1ll*x*y-1ll*x*y/P*P;}
int ksm(R int x,R int y){
R int res=1;
for(;y;y>>=1,x=mul(x,x))if(y&1)res=mul(res,x);
return res;
}
int l1,l2,num1[N],num2[N],k,p,ans;
int f[2][2][2][N];ll n,m;
int dfs(int p,int q,int ok,int pos){
if(!pos)return ok;
if(~f[p][q][ok][pos])return f[p][q][ok][pos];
int res=0,lm1=p?k-1:num1[pos],lm2=q?k-1:num2[pos];
fp(i,0,lm1)fp(j,0,lm2)
res=add(res,dfs(p|(i<lm1),q|(j<lm2),ok|(i<j),pos-1));
return f[p][q][ok][pos]=res;
}
void solve(){
n=read(),m=read(),l1=l2=0,m=min(n,m),p=m%P;
memset(f,-1,sizeof(f));
while(n)num1[++l1]=n%k,n/=k;
while(m)num2[++l2]=m%k,m/=k;
while(l2<=l1)num2[++l2]=0;
ans=dfs(0,0,0,l1);
ans=dec(ans,1ll*(p+1)*p%P*inv%P);
printf("%d\n",ans);
}
int main(){
// freopen("testdata.in","r",stdin);
int T=read();k=read();
while(T--)solve();
return 0;
}

uoj#275. 【清华集训2016】组合数问题(数位dp)的更多相关文章

  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 275. 【清华集训2016】组合数问题

    UOJ 275. [清华集训2016]组合数问题 组合数 $C_n^m $表示的是从 \(n\) 个物品中选出 \(m\) 个物品的方案数.举个例子,从$ (1,2,3)(1,2,3)$ 三个物品中选 ...

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. csslint

    http://csslint.net/ line column title description browserwarning 1 1 Disallow @import @import preven ...

  2. mybatis入门(四)

    mybatis入门 需求:根据id查询用户的信息 mysql数据库: CREATE TABLE `user` (  `id` int(11) NOT NULL AUTO_INCREMENT,  `us ...

  3. wprintf、wcout无法输出中文的解决方案

    在C语言中,若wprintf无法输出中文,调用函数setlocale(int category, const char *locale)设置locale即可输出中文 此方法也可用于C++中 例: #i ...

  4. 编译性语言&amp;解释性语言

    计算机是不能理解高级语言.当然也就不能直接执行高级语言了.计算机仅仅能直接理解机器语言,所以不论什么语言,都必须将其翻译成机器语言.不论什么编程语言编写的程序归根究竟都是由底层机器的机器代码(01序列 ...

  5. CodeSign相关

    要让苹果App在真机上跑,需要私钥(PrivateKey),证书(Certificate)和描述文件(Provisioning Profile). (一) 安全基础: 1.非对称加密: 2.Hash码 ...

  6. RSA加密:利用模数和指数生成公钥加密

    引子 目前做一款金融产品,由于涉及到资金安全,采用动态公钥的方式,即客户端每次登录服务端返回一个不同的XML串,由公钥的模数和指数构成,我需要用这个串生成公钥加密相关信息.服务端返回的XML串形如: ...

  7. TCP/IP-ICMP-Ping-Traceroute

    TCP/IP-ICMP 作者:Danbo 2015-8-22 I C M P经常被认为是I P层的一个组成部分.它传递差错报文以及其他需要注意的信息.I C M P报文通常被I P层或更高层协议( T ...

  8. [bzoj1002] [FJOI2007]轮状病毒轮状病毒(基尔霍夫矩阵)

    Description 轮状病毒有很多变种,所有轮状病毒的变种都是从一个轮状基产生的.一个N轮状基由圆环上N个不同的基原子 和圆心处一个核原子构成的,2个原子之间的边表示这2个原子之间的信息通道.如下 ...

  9. sdut oj 1163 C语言实验——排列 (当初不会递归生成排列,这个题目现在才补上 刘汝佳给出了写法 *【模板】 当然有生成全排列的函数存在 )

    C语言实验——排列 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 有4个互不相同的数字,请按序输出由其中三个不重复数字组成的排列 ...

  10. JDBC 笔记3 通过PreparedStatement 对数据库进行增删改查 (转载)

    之前MVC时一直用它,学了框架后就没怎么用了.这里转载一位同学的博客,以后可能也会用到的. 转自:https://www.cnblogs.com/zilong882008/archive/2011/1 ...