[SDOI 2013]方程
Description
求不定方程 \(x_1+x_2+\cdots +x_n=m\) 的正整数解的个数,并且要求满足限定: \(\forall i\in[1,n_1] x_i\leq a_i,\forall i\in[1,n_2] x_{n_1+i}\geq a_{n_1+i}\) 。对 \(p\) 取模, \(t\) 组询问。
\(n\leq 10^9,n_1\leq 8,n_2\leq 8,m\leq 10^9, p\leq 437367875,t\leq 5\)
Solution
如果没有约束,显然答案就是 \(C_{m-1}^{n-1}\) 。
对于第二种约束,显然直接在总数中减去就好。
考虑如何处理第一种约束,其实直接容斥就好了,处理方法类似于第二种约束。
注意到模数不一定为质数,还需要扩展 \(lucas\) 。
Code
#include <bits/stdc++.h>
using namespace std;
int n, n1, n2, p, t, a[10], ans, m;
int fac[200005], pi[100005], pk[100005], tot;
int quick_pow(int a, int b, int p) {
int ans = 1;
while (b) {
if (b&1) ans = 1ll*ans*a%p;
b >>= 1, a = 1ll*a*a%p;
}
return ans;
}
void ex_gcd(int a, int b, int &x, int &y) {
if (b == 0) {x = 1; y = 0; return; }
ex_gcd(b, a%b, x, y);
int t = x; x = y; y = t-a/b*y;
}
int inv(int a, int p) {
int x, y; ex_gcd(a, p, x, y);
return (x%p+p)%p;
}
int mul(int a, int pi, int pk) {
if (a <= pi) return fac[a];
int ans = fac[pk]; ans = quick_pow(ans, a/pk, pk);
ans = 1ll*ans*fac[a%pk]%pk;
return 1ll*ans*mul(a/pi, pi, pk)%pk;
}
int C(int n, int m, int pi, int pk) {
int t = 0;
for (int i = n; i; i /= pi) t += i/pi;
for (int i = m; i; i /= pi) t -= i/pi;
for (int i = n-m; i; i /= pi) t -= i/pi;
if (quick_pow(pi, t, pk) == 0) return 0;
fac[0] = 1; for (int i = 1; i <= pk; i++) if (i%pi) fac[i] = 1ll*i*fac[i-1]%pk; else fac[i] = fac[i-1];
int a = mul(n, pi, pk), b = mul(m, pi, pk), c = mul(n-m, pi, pk);
return 1ll*a*quick_pow(pi, t, pk)%pk*inv(b, pk)%pk*inv(c, pk)%pk;
}
int ex_lucas(int n, int m, int p) {
int ans = 0;
for (int i = 1; i <= tot; i++)
(ans += 1ll*C(n, m, pi[i], pk[i])*(p/pk[i])%p*inv(p/pk[i], pk[i])%p) %= p;
return ans;
}
void dfs(int c, int r, int f) {
if (c == n1+1) {
if (r < n) return;
(ans += ex_lucas(r-1, n-1, p)*f) %= p; return;
}
dfs(c+1, r, f); dfs(c+1, r-a[c], -f);
}
void work() {
scanf("%d%d", &t, &p);
int T = p;
for (int i = 2, x = sqrt(T); i <= x; i++)
if (T%i == 0) {
int tol = 1; while (T%i == 0) tol *= i, T /= i;
pi[++tot] = i, pk[tot] = tol;
}
if (T != 1) pi[++tot] = pk[tot] = T;
while (t--) {
scanf("%d%d%d%d", &n, &n1, &n2, &m);
for (int i = 1; i <= n1; i++) scanf("%d", &a[i]);
for (int i = 1; i <= n2; i++) {scanf("%d", &T); if (T) m -= T-1; }
ans = 0; dfs(1, m, 1); printf("%d\n", (ans+p)%p);
}
}
int main() {work(); return 0; }
[SDOI 2013]方程的更多相关文章
- [BZOJ 3123] [SDOI 2013]森林(可持久化线段树+并查集+启发式合并)
[BZOJ 3123] [SDOI 2013]森林(可持久化线段树+启发式合并) 题面 给出一个n个节点m条边的森林,每个节点都有一个权值.有两种操作: Q x y k查询点x到点y路径上所有的权值中 ...
- BZOJ 3203 sdoi 2013 保护出题人
由于样例解释很清晰,所以很容易得到以下结论: 1.每一关都是独立的,且僵尸的相对位置不会变 2.每一关的攻击力=Max(sum(i)/dis(i)) 其实sum(i)是僵尸攻击力的前缀和,dis(i) ...
- [SDOI 2013]森林
Description 题库链接 给你 \(n\) 个节点,初始 \(m\) 条边, \(t\) 组操作.让你支持: 询问树上路径点权 \(K\) 小: 支持加边操作. 强制在线,所有状态保证是一个树 ...
- 解题:SDOI 2013 保护出题人
题面 首先是愉快的推式子 $dp[i]=max(dp[i],\frac{sum[i]-sum[j-1]}{x[i]+(i-j)*d})(1<=j<=i<=n)$(考虑有一只僵尸正好走 ...
- 「BZOJ 3123」「SDOI 2013」森林「启发式合并」
题意 你有一个森林,你需要支持两个操作 查询两个结点路径上权值第\(k\)小 两个点之间连一条边 强制在线,结点数\(\leq 8\times 10^4\) 题解 如果可以离线,这就是一个主席树板子题 ...
- bzoj 3202 [Sdoi 2013] 项链 —— 置换+计数
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3202 参考了博客: https://www.cnblogs.com/zhoushuyu/p/ ...
- [SDOI 2013] 直径
[题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=3124 [算法] 树的直径 [代码] #include<bits/stdc++. ...
- [日常摸鱼]bzoj3122 [Sdoi]2013 随机数生成器
又是写了一晚上才过的题- 题意:有一个数列$x_n=(ax_{n-1}+b) mod p$,给你$x_1,a,b,p,t$,求最小的$x_i=t$的$i$,可能不存在 一开始很自然的推出了式子$x_n ...
- HNOI 2012 永无乡
codevs 1477 永无乡 http://codevs.cn/problem/1477/ 2012年湖南湖北省队选拔赛 时间限制: 1 s 空间限制: 128000 KB 题目描述 Des ...
随机推荐
- 记录python接口自动化测试--requests使用和基本方法封装(第一目)
之前学习了使用jmeter+ant做接口测试,并实现了接口的批量维护管理(大概500多条用例),对"接口"以及"接口测试"有了一个基础了解,最近找了一些用pyt ...
- WORK
团队展示 队伍信息 队名:小狗队 队长:刘映华(201421122021) 队员:兰运良(201421122030).郭和水(201421122017) 团队项目描述 团队项目描述是基于之前的四则运算 ...
- 201621123057 《Java程序设计》第13周学习总结
1. 本周学习总结 以你喜欢的方式(思维导图.OneNote或其他)归纳总结多网络相关内容. 2. 为你的系统增加网络功能(购物车.图书馆管理.斗地主等)-分组完成 为了让你的系统可以被多个用户通过网 ...
- python实现简单tftp(基于udp)
tftp是基于udp的协议 实现简单的tftp,首先要有tftp的协议图. tftp默认接收端口为69,但每次有连接过来后,tftp会随机分配一个端口来专门为这个连接来服务. 操作码:1.上传 2.下 ...
- 如何书写高效的css样式
如何书写高效的css样式? 有以下四个关键要素: 1.高效的css 2.可维护的css 3.组件化的css 4.hack-free css 书写高效的css: 1.使用外联样式替代行间样式或内嵌样式 ...
- python django的ManyToMany简述
Django的多对多关系 在Django的关系中,有一对一,一对多,多对多的关系 我们这里谈的是多对多的关系 ==我们首先来设计一个用于示例的表结构== # -*- coding: utf-8 -*- ...
- jiVMware的网络配置Linux
需求需要配置VMware的虚拟Linux的ip以达到本地可以访问,而且虚拟机Linux可以上网: 第一方案:选择桥接模式 思路:因为桥接可以,使得虚拟机Linux把本地当做一座桥一样连接到路由器,然后 ...
- ORA-00379 缓冲池 DEFAULT 中无法提供 32K 块大小的空闲缓冲区
(一)问题 今天在使用Pl/sql developer查看表空间大小的时候,报错误:ORA-00379 缓冲池 DEFAULT 中无法提供 32K 块大小的空闲缓冲区,具体如下图: SQL> s ...
- Vue.js和jQuery混合使用的一点注意事项
首先,Vue 的官方是不建议直接操作 DOM 的,其优势在于视图和数据的双向绑定,而且所有DOM操作都可以用Vue实现,反而使用jQuery来操作DOM的话,会造成不必要的麻烦,DOM未渲染完成之前事 ...
- SpringCloud应用入库后乱码问题
一.现象 1.请求 2.入库后 二.解决过程 1.配置application.properties 2.代码配置 3.数据库(关键!!) 3.请求 三.验证过程 1.win10 - 本地验证通过 2. ...