首页 > 其他分享 >[清华集训2016] 组合数问题

[清华集训2016] 组合数问题

时间:2023-10-28 10:44:34浏览次数:40  
标签:tmp 清华 int ll b1 b2 b3 2016 集训

题目链接1题目链接2

这道题的难点在于 \(k|C_{i}^{j}\) 这个特殊限制。

由于 \(n,m\) 的范围很大,再加上式子中有组合数,我们自然而然地想到了 \(\text{lucas}\) 定理:

\[C_{n}^{m}={C_{\lfloor\frac{n}{k}\rfloor}^{\lfloor\frac{m}{k}\rfloor}\times C_{n\%k}^{m\%k}}\pmod k \]

不难发现这是一个 \(k\) 进制下的形式。再由于 \(k\) 是质数,所以最终 \(k|C_{i}^{j}\) 当且仅当某一个 \(C_{n\%k}^{m\%k}=0\)。

考虑直接在 \(k\) 进制下数位 \(\text{DP}\)。记 \(f_{x,y,b1,b2,b3}\) 为当前从高到低考虑到了第 \(x\) 位,前面那些位里是(\(y=1\))否(\(y=0\))已经有元素满足 \(C_{n\%k}^{m\%k}=0\),\(i\) 是(\(b1=1\))否(\(b1=0\))抵到上界,\(j\) 是(\(b2=1\))否(\(b2=0\))抵到上界,\(j\) 是 \(b3=1\) 否 \(b3=0\) 抵到 \(i\) 的大小。

转移比较套路,这里不作赘述。

状态数 \(O(\log k\times 2^4)\),单词转移复杂度为 \(O(k^2)\),总时间复杂度为 \(O(T\times \log k\times 2^4\times k^2)\),可以通过。

点击查看代码
#include <bits/stdc++.h>
#define FL(i, a, b) for(int i = (a); i <= (b); ++i)
#define FR(i, a, b) for(int i = (a); i >= (b); --i)
using namespace std;
typedef long long ll;
const int N = 66, K = 110, mod = 1e9 + 7;
int k, t, t2, a[N], b[N], C[K][K];
ll n, m, f[N][2][2][2][2];
ll F(int x, int y, int b1, int b2, int b3){
    if(!x) return y;
    if(~f[x][y][b1][b2][b3]) return f[x][y][b1][b2][b3];
    int rn = b1? a[x] : k - 1; ll s = 0;
    FL(i, 0, rn){
        int rm = min((b3? i : k - 1), (b2? b[x] : k - 1));
        FL(j, 0, rm){
            s += F(x - 1, (y || !C[i][j]), (b1 && i == a[x]), (b2 && j == b[x]), (b3 && i == j));
            s %= mod;
        }
    }
    return f[x][y][b1][b2][b3] = s;
}
void solve(){
    scanf("%lld%lld", &n, &m);
    memset(f, -1, sizeof(f)), t = t2 = 0;
    memset(a, 0, sizeof(a));
    memset(b, 0, sizeof(b));
    ll tmp = n;
    while(tmp) a[++t] = tmp % k, tmp /= k;
    tmp = m;
    while(tmp) b[++t2] = tmp % k, tmp /= k;
    printf("%lld\n", F(max(t, t2), 0, 1, 1, 1));
}
int main(){
    int T; scanf("%d%d", &T, &k);
    FL(i, 0, k){
        C[i][0] = 1;
        FL(j, 1, i){
            C[i][j] = (C[i - 1][j - 1] + C[i - 1][j]) % k;
        }
    }
    while(T--) solve();
    return 0;
}

标签:tmp,清华,int,ll,b1,b2,b3,2016,集训
From: https://www.cnblogs.com/zac2010/p/17793775.html

相关文章

  • P4069 SDOI2016 游戏
    传送门solution树剖后一段路径变成了若干链拼起来。自上而下和自下而上分别维护两棵李超线段树,每条链就是一段数轴,提前处理每个点两种方向上的在链内的横坐标。以最近公共祖先为界,把路径分成两段。从一个点向链的顶端跳就是区间加线段。每次跳完要把线段的截距增加一个横坐标偏......
  • P5336 [THUSC2016] 成绩单
    这得是区间dp。还需要限制一下值域。因此dp状态时\(f_{l,r,x,y}\)表示使\([l,r]\)区间所有值都处于\([x,y]\)的最小花费。设\(g_{l,r}=\min\{f_{l,r,x,y}+a+b(x-y)^2\}\)。思考一个序列可以被怎么消掉。维护一个类似括号序列的东西,左右匹配的括号......
  • 获得清华博士学位的条件之一:不辱师门
    分享:贾庆山老师一个群体PermanentheadDamage的博士生群体 PermanentheadDamage=Ph.D 博士生一年级的同学们,不要担忧或高兴得太早,抱歉你们还没有经历Qualification——预备考试,你们暂且不能被称为博士,只能称自己是要努力成为博士预备生的学生。等过了一年到了博二,你们会疑......
  • 软考系列(系统架构师)- 2016年系统架构师软考案例分析考点
    试题一软件架构(质量属性、架构风格对比、根据描述填空)试题二系统开发(用例图参与者、用例关系、类图关系)学生、教师、管理员、时间、打印机【问题2】(7分)用例是对系统行为的动态描述,用例获取是需求分析阶段的主要任务之一。请指出在面向对象系统建模中,用例之间的关系有......
  • VK Cup 2016 - Round 1 (CF639)
    A.BearandDisplayedFriends这是Div2的题,不写。B.BearandForgottenTree3这种东西怎么评蓝的?Description给定\(n,d,h\),构造一棵有\(n\)个点,直径为\(d\),高度为\(h\)的树。\(n\le10^5\)。Solution首先\(d>2h\)是无解的,\(d=h=1\)且\(n>2\)的时候也无解......
  • 集训题单
    P1323删数问题 题目传送门 贪心+模拟 这个模拟的话就是前面加数的地方,本来以为到\(3e4\)的时候这个数很大,但是我打表打出来看了一下,发现不大,只有几万还是几十万,所以完全可以存的下的。 他要求最小的,所以用一个优先队列来维护就可以了,然后我们就求出了一列数字,然后考虑......
  • 2023 秋季学期 六周集训 Misc方向
    by高鹏鸿、密语写在前面,记录和交流是一个很好的习惯,建议可以自己先搭建一个博客用于存储自己的做题记录以及方便交流。还有,对于Misc方向,灵活应对十分重要,一定要善用搜索引擎。还有一点,给大家做的题有些能在网络上搜索到,大家实在实在坐牢很久了再去搜索工具搜索引擎新手......
  • [Ynoi2016] 镜中的昆虫
    64MB,1.5s题目描述您正在欣赏galgame的HS,然后游戏崩溃了,于是您只能做数据结构题了:维护一个长为 \(n\) 的序列 \(a_i\),有 \(m\) 次操作。将区间 \([l,r]\) 的值修改为 \(x\)。询问区间 \([l,r]\) 出现了多少种不同的数,也就是说同一个数出现多次只算一个。......
  • Windows Server 2016 OVF, updated Oct 2023 (sysin) - VMware 虚拟机模板
    WindowsServer2016OVF,updatedOct2023(sysin)-VMware虚拟机模板2023年10月版本更新,现在自动运行sysprep,支持ESXiHostClient部署请访问原文链接:https://sysin.org/blog/windows-server-2016-ovf/,查看最新版。原创作品,转载请保留出处。作者主页:sysin.org现在......
  • Windows Server 2016 Standard RemoteApp应用发布配置举例
    RemoteApp应用发布介绍RemoteApp是微软在WindowsServer2008之后,在其系统中集成的一项服务功能,用户可以通过远程桌面访问远端服务器的桌面与程序,客户端本机在无须安装操作系统与应用程序的情况下也能正常使用远端服务器发布的各种桌面与应用。而在Windows2016中RemoteApp已......