【NOI2019模拟2019.6.29】组合数(Lucas定理、数位dp)
Description:

p<=10且p是质数,n<=7,l,r<=1e18
题解:
Lucas定理:
\(C_{n}^m=C_{n~mod~p}^{m~mod~p}*C_{n/p}^{m/p}\)
若把\(n,m\)在p进制下分解,那么就是\(\prod C_{n[i]}^{m[i]}\)。
对于\(∈[l,r]\)的限制先容斥为\(<=r\)。
考虑从低位到高位的数位dp,设\(f[i][S][j]\)表示做了前i位,S[i]第i个数选的数是<=还是>,进了j位,的系数和。
转移的话可以枚举每个数这一位选了什么,当然就是枚举<=或者>,当然这样还是很慢。
不妨再用一个dp来转移,设\(g[i][S][j]\)表示考虑了前i个数,现在的状压态是S,这一位的和是j,初值是\(g[0][S][j]=f[i][S][j]\)。
那么总时间复杂度大概是\(O(2^n*log_p^m*2^n*(pn)^2)\)
反正跑得过。
Code:
#include<bits/stdc++.h>
#define fo(i, x, y) for(int i = x, B = y; i <= B; i ++)
#define ff(i, x, y) for(int i = x, B = y; i < B; i ++)
#define fd(i, x, y) for(int i = x, B = y; i >= B; i --)
#define ll long long
#define pp printf
#define hh pp("\n")
using namespace std;
int jx[11][11];
int n, p;
ll m, l[101], r[11], a[11];
int b[101], b0, c[11][101], c0[11];
int a2[10];
int ans;
int f[2][1 << 7][8], o;
int g[2][1 << 7][60], o2;
#define mem(a) memset(a, 0, sizeof a)
void dp(int xs) {
mem(c);
fo(i, 1, n) {
ll v = a[i];
c0[i] = 0;
for(; v > 0; v /= p) c[i][++ c0[i]] = v % p;
}
mem(f); f[o][0][0] = 1;
fo(i, 1, b0) {
mem(f[!o]);
mem(g);
ff(j, 0, a2[n]) fo(k, 0, n - 1) g[o2][j][k] = f[o][j][k];
fo(j, 1, n) {
mem(g[!o2]);
ff(s, 0, a2[n]) fo(k, 0, 48) if(g[o2][s][k]) {
g[o2][s][k] %= p;
int s2 = s & (a2[n] - 1 - a2[j - 1]);
int ns = s2;
int l = 0, r = c[j][i] - 1;
fo(u, l, r) g[!o2][ns][k + u] += g[o2][s][k];
ns = s;
l = r = c[j][i];
g[!o2][ns][k + l] += g[o2][s][k];
ns = s2 + a2[j - 1];
l = c[j][i] + 1, r = p - 1;
fo(u, l, r) g[!o2][ns][k + u] += g[o2][s][k];
}
o2 = !o2;
}
ff(s, 0, a2[n]) fo(k, 0, 48) {
f[!o][s][k / p] += g[o2][s][k] * jx[b[i]][k % p];
}
ff(s, 0, a2[n]) fo(k, 0, p - 1) f[!o][s][k] %= p;
o = !o;
}
ff(s, 0, a2[n]) {
int ky = 1;
fo(j, 1, n) if((s >> (j - 1) & 1) && c0[j] <= b0) { ky = 0; break;}
if(ky) ans = (ans + f[o][s][0] * xs) % p;
}
}
void dg(int x, int xs) {
if(x > n) {
dp(xs);
return;
}
a[x] = l[x] - 1; dg(x + 1, -xs);
a[x] = r[x]; dg(x + 1, xs);
}
int main() {
freopen("combination.in", "r", stdin);
freopen("combination.out", "w", stdout);
fo(i, 0, 7) a2[i] = 1 << i;
scanf("%d %lld %d", &n, &m, &p);
fo(i, 0, 10) {
jx[i][0] = 1;
fo(j, 1, i) jx[i][j] = (jx[i - 1][j - 1] + jx[i - 1][j]) % p;
}
fo(i, 1, n) scanf("%lld %lld", &l[i], &r[i]);
for(; m; m /= p) b[++ b0] = m % p;
dg(1, 1);
ans = (ans % p + p) % p;
pp("%d\n", ans);
}
【NOI2019模拟2019.6.29】组合数(Lucas定理、数位dp)的更多相关文章
- uoj86 mx的组合数 (lucas定理+数位dp+原根与指标+NTT)
uoj86 mx的组合数 (lucas定理+数位dp+原根与指标+NTT) uoj 题目描述自己看去吧( 题解时间 首先看到 $ p $ 这么小还是质数,第一时间想到 $ lucas $ 定理. 注意 ...
- BZOJ4737 组合数问题 【Lucas定理 + 数位dp】
题目 组合数C(n,m)表示的是从n个物品中选出m个物品的方案数.举个例子,从(1,2,3)三个物品中选择两个物品可以有( 1,2),(1,3),(2,3)这三种选择方法.根据组合数的定义,我们可以给 ...
- bzoj 1902: Zju2116 Christopher lucas定理 && 数位DP
1902: Zju2116 Christopher Time Limit: 1 Sec Memory Limit: 64 MBSubmit: 172 Solved: 67[Submit][Stat ...
- [BZOJ4591][SHOI2015]超能粒子炮·改(Lucas定理+数位DP)
大组合数取模可以想到Lucas,考虑Lucas的意义,实际上是把数看成P进制计算. 于是问题变成求1~k的所有2333进制数上每一位数的组合数之积. 数位DP,f[i][0/1]表示从高到低第i位,这 ...
- [JZOJ6241]【NOI2019模拟2019.6.29】字符串【数据结构】【字符串】
Description 给出一个长为n的字符串\(S\)和一个长为n的序列\(a\) 定义一个函数\(f(l,r)\)表示子串\(S[l..r]\)的任意两个后缀的最长公共前缀的最大值. 现在有q组询 ...
- 【NOI2019模拟2019.6.29】字符串(SA|SAM+主席树)
Description: 1<=n<=5e4 题解: 考虑\(f\)这个东西应该是怎样算的? 不妨建出SA,然后按height从大到小启发式合并,显然只有相邻的才可能成为最优答案.这样的只 ...
- 【(好题)组合数+Lucas定理+公式递推(lowbit+滚动数组)+打表找规律】2017多校训练七 HDU 6129 Just do it
http://acm.hdu.edu.cn/showproblem.php?pid=6129 [题意] 对于一个长度为n的序列a,我们可以计算b[i]=a1^a2^......^ai,这样得到序列b ...
- 【BZOJ-4591】超能粒子炮·改 数论 + 组合数 + Lucas定理
4591: [Shoi2015]超能粒子炮·改 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 95 Solved: 33[Submit][Statu ...
- [Swust OJ 247]--皇帝的新衣(组合数+Lucas定理)
题目链接:http://acm.swust.edu.cn/problem/0247/ Time limit(ms): 1000 Memory limit(kb): 65535 Descriptio ...
随机推荐
- usermod - modify a user account
-a, --append Add the user to the supplementary group(s). Use only with the -G option. -G, --groups G ...
- Quartz.Net 任务调度之简单任务(1)
本文github链接 https://github.com/sunshuaize/cnBlogDemos/tree/master/Quartz.Net%20%E4%BB%BB%E5%8A%A1%E8% ...
- leetcode-第14周双周赛-1274-矩形内船只的数目
题目描述: 自己的提交: # """ # This is Sea's API interface. # You should not implement it, or s ...
- UNP学习第六章(二)
一.描述符就绪条件 对于引起select返回套接字“就绪”的条件我们必须讨论得更明确: (1)满足一下塞个条件中的仍和一个时,一个套接字准备好读. a)该套接字接收缓冲区中的数据字节数不大于等于套接字 ...
- STM32的结构和启动模式
一.STM32F10x功能模块 32位的Cortex-M3微处理器: 可嵌套的向量中断控制器(NVIC)和60个可屏蔽中断且有16个可编程优先级: 内嵌内存: FLASH:最大512K字节 STAM: ...
- docker监控方案实践(cadvisor+influxdb+grafana)
一.概要 1.1 背景 虚拟化技术如今已经非常热门,如果你不知道什么是虚拟化,那你应该了解虚拟机.虚拟化技术如同虚拟机一样,用于将某些硬件通过软件方式实现"复制",虚拟出" ...
- paper 143:人脸验证
持续更新ing,敬请期待! 参考:http://blog.csdn.net/stdcoutzyx/article/details/42091205 1. DeepID人脸识别算法 香港中文大学的团队 ...
- 三种做法:BZOJ 2780: [Spoj]8093 Sevenk Love Oimaster
目录 题意 思路 AC_Code1 AC_Code2 AC_Code3 参考 @(bzoj 2780: [Spoj]8093 Sevenk Love Oimaster) 题意 链接:here 有\(n ...
- ASP.NET Error Handling
https://docs.microsoft.com/en-us/aspnet/web-forms/overview/getting-started/getting-started-with-aspn ...
- java并发编程笔记(四)——安全发布对象
java并发编程笔记(四)--安全发布对象 发布对象 使一个对象能够被当前范围之外的代码所使用 对象逸出 一种错误的发布.当一个对象还没构造完成时,就使它被其他线程所见 不安全的发布对象 某一个类的构 ...