题解:P3301 [SDOI2013] 方程

news/2025/10/7 21:03:35/文章来源:https://www.cnblogs.com/JohnYam/p/19055958

传送门

首先如果没有任何限制条件,则原问题即变为简单的「求方程 \(\sum_{i=1}^nx_i=m\) 的解的个数」。此时考虑插板法,等价于将 \(m\)\(1\) 分成 \(n\) 份,这时有 \(m-1\) 个空隙,要插 \(n-1\) 个板,方案数就是 \(\binom{m-1}{n-1}\)

现在有两类限制条件。第二类条件 \(x_i\ge a_i\) 容易考虑,因为所有 \(x_i\) 的共有限制是 \(x_i\ge1\),因此把 \(x_i\ge a_i\) 的不等号两端同时减去 \(a_i-1\) 即得 \(x_i-a_i+1\ge1\),转化成为所有 \(x_i\) 共有的条件。

第一类条件 \(x_i\le a_i\) 难以处理,因此考虑容斥。该式的逆命题即为 \(x_i\ge a_i+1\),类似地将不等式两端同时减去 \(a_i\),转化为 \(x_i-a_i\ge1\)。因为 \(n_1\le8\),可以使用状态压缩的方法枚举不满足哪几个条件。对于每一种枚举的结果,将 \(m\) 减去不满足的条件对应的 \(a_i\) 得到一个数 \(tmp\),用插板法计算出方案数 \(\binom{tmp-1}{n-1}\),乘上容斥系数之后再全部加起来就是答案。

求组合数时,观察数据范围发现 \(n,m\) 较大且 \(p\) 不一定是质数,因此使用扩展 Lucas 定理。但是直接写板子常数较大难以通过,可以使用提前处理(细节参考代码中 C 函数的前半部分)等方法进行优化,从而通过本题。

代码如下:

#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 1e6 + 10;
int T, p, n, n1, n2, m, a[20], f[N];
int qpow (int a, int b, int mod) {int res = 1;for (; b; b >>= 1, a = a * a % mod)if (b & 1)res = res * a % mod;return res;
}
int exgcd (int a, int b, int &x, int &y) {if (!b) {x = 1, y = 0;return a;}int d = exgcd(b, a % b, x, y), t = x;x = y, y = t - a / b * y;return d;
}
int fac (int n, int d, int t) {if (!n)return 1;if (n < d)return f[n];return qpow(f[t - 1], n / t, t) * f[n % t] % t * fac(n / d, d, t) % t; 
}
int inv (int n, int mod) {int x, y;exgcd(n, mod, x, y);return (x % p + p) % p;
}
int crt (int a, int mod) {return a * (p / mod) % p * inv(p / mod, mod) % p;
}
int C (int n, int m, int d, int t) {if (n < m)return 0;f[0] = 1;for (int i = 1; i <= t; ++i) {if (i % d != 0)f[i] = f[i - 1] * i % t;elsef[i] = f[i - 1];}int fz = fac(n, d, t), fm1 = fac(m, d, t), fm2 = fac(n - m, d, t), k = 0;for (int i = n; i; i /= d)k += i / d;for (int i = m; i; i /= d)k -= i / d;for (int i = n - m; i; i /= d)k -= i / d;return fz * inv(fm1, t) % t * inv(fm2, t) % t * qpow(d, k, t) % t; 
}
int solve (int n, int m, int d, int t) {int res = 0, s = 1 << n1;for (int i = 0; i < s; ++i) {int op = 1, tmp = n;for (int j = 0; j < n1; ++j)if (i >> j & 1)op = -op, tmp -= a[j + 1];(res += op * C(tmp, m, d, t)) %= t;}return res;
}
int exlucas (int n, int m) {if (n < m)return 0;int res = 0, tmp = p, d;for (int i = 2; i * i <= p; ++i)if (tmp % i == 0) {d = 1;while (tmp % i == 0)d *= i, tmp /= i;(res += crt(solve(n, m, i, d), d)) %= p;}if (tmp != 1)(res += crt(solve(n, m, tmp, tmp), tmp)) %= p;return (res % p + p) % p;
}
signed main () {ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);cin >> T >> p;while (T--) {cin >> n >> n1 >> n2 >> m;for (int i = 1; i <= n1 + n2; ++i)cin >> a[i];for (int i = n1 + 1; i <= n1 + n2; ++i)m -= (a[i] - 1);cout << exlucas(m - 1, n - 1) << endl;} return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/930838.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

# 20232321 2025-2026-1 《网络与系统攻防技术》实验一实验报告

1.实验内容1.1直接修改程序机器指令,改变程序执行流程————通过直接修改可执行文件改变流程 1.2通过构造输入参数,造成BOF攻击,改变程序执行流————通过利用缓冲区溢出的漏洞,使返回的地址跳转到getshell 1.…

基于深度学习的语音识别高效的系统设计与实现

基于深度学习的语音识别高效的系统设计与实现pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", &qu…

[ARC201B] Binary Knapsack 大大背包

思路 第一眼背包, 但是 \(n \leq 2e5\) 和重量 $ 2^{X}, X\in[0,60)$ 。所以不能使用背包 由于重量为 $ 2^{X}$ , 很有可能与二进制有关, 于是按位贪心 开 \(65\) 个优先队列,每个优先队列里存放对应与下标相等的 …

网站开发要什么软件济南抖音推广公司

目录 前言 1-保持小的拉取请求 2-使用拉取请求模板 3-实施响应时间 SLA 4-培训初级和中级工程师 5-设置持续集成管道 6-使用拉取请求审查应用程序 7-生成图表以可视化您的代码更改 前言 代码审查可能会很痛苦软件工程师经常抱怨审查过程缓慢&#xff0c;延迟下游任务&…

宁波做网站建设推广广推科技(北京)有限公司

✅作者简介&#xff1a;大家好&#xff0c;我是 Meteors., 向往着更加简洁高效的代码写法与编程方式&#xff0c;持续分享Java技术内容。 &#x1f34e;个人主页&#xff1a;Meteors.的博客 &#x1f49e;当前专栏&#xff1a;Java微服务 ✨特色专栏&#xff1a; 知识分享 &…

题解:CF1292E Rin and The Unknown Flower

传送门 一道有趣的思维题。 我们从最简单的情况开始考虑:如果还剩下 \(2\) 格电呢? 那么直接询问 \(\texttt{O}\) 和 \(\texttt{H}\),剩下的位置就是 \(\texttt{C}\)。 从以上的朴素做法中我们得到启发:能不能通过…

打印A3大小的PDF文件为A4幅面

Foxit 福昕打印pdf:放大150% 然后把每页旋转180度,保存,打印。方法一: 用 Acrobat Pro DC 旋转。 方法二: 用 illustrator,打开pdf,选择某页,旋转,保存

一个完整的网站建设怎么在58同城上做网站

linux服务器的字符集设置可能影响到网站页面出现 “&#xff1f;&#xff1f;&#xff1f;” 等问号乱码&#xff0c;还有可能导致文件中的汉字部分出现乱码。有两个原因 服务器没有安装 zh_CN.UTF-8 字符集&#xff0c;导致不支持中文&#xff01;服务器虽然装了 zh_CN.UTF-8…

深入解析:SpringBoot-Thymeleaf

深入解析:SpringBoot-Thymeleafpre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco&qu…

课程总结2

请看下列代码,你发现有什么特殊之处吗? public class MethodOverload { public static void main (String [] args) { System.out.println ("The square of integer 7 is" + square (7)); System.out.prin…

延安网站建设哪家专业深圳多区最新通知

‍作者|张祥威 编辑|德新 多位知情人士告诉HiEV&#xff0c;智能网联汽车准入试点通知&#xff0c;乐观预计将在一个月内发布。试点的推动&#xff0c;意味着国家层面的自动驾驶L3标准随之到来。 「L3标准内容大部分与主机厂相关&#xff0c;由工信部牵头&#xff0c;找了几家…

机器学习:集成学习概念、分类、随机森林 - 实践

机器学习:集成学习概念、分类、随机森林 - 实践2025-10-07 20:45 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display…

sudo docker exec -it backend bash 以交互方式(interactive)进入正在运行的 Docker 容器的命令行环境 - 实践

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

解码查找算法与哈希表

查找基础概念 查找的定义 查找(又称搜索)是从一组数据中,找出 “关键字与目标值匹配” 的记录的操作;若找到则返回记录的位置(如数组下标),若未找到则返回 “不存在” 标识(如-1)。 查找效率的影响因素数据存…

完整教程:MySQL 如何判断某个表中是否存在某个字段

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

2025/10/7

2025/10/7休息一天

NVMe IP现状扫盲 - 指南

NVMe IP现状扫盲 - 指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", &qu…

山西正规网站建设推广如何分析网站流量

项目介绍 ChatTTS是一款专为优化对话场景而生的语音生成模型&#xff0c;尤其匹配大型语言模型&#xff08;LLM&#xff09;的交互需求&#xff0c;以及生成对话式音频、视频旁白等应用场景&#xff0c;无缝覆盖中英文双语。 通过汲取约100,000小时的高质量中英语音数据进行深…

字体设计教程网站好变装chinacd wordpress

泛型&#xff08;宽泛的&#xff0c;不确定的类型&#xff09; 使用场景&#xff1a;定义一个函数或类时&#xff0c;无法确定要使用的具体类型&#xff08;返回值、参数、属性的类型不能确定&#xff09;泛型使用时相当于一个参数 functiondemo<T>(arg: T): T{return …