方程的解
方程的解
佳佳碰到了一个难题,请你来帮忙解决。
对于不定方程 ,其中 且 , 是正整数,(即 除以 的余数), 是给定的数。
我们要求的是这个不定方程的正整数解组数。
举例来说,当 时,方程的解分别为:
输入格式
有且只有一行,为用空格隔开的两个正整数,依次为 。
输出格式
有且只有一行,为方程的正整数解组数。
数据范围
,
,
输入样例:
3 2
输出样例:
3
解题思路
假设,这个可以用快速幂来求。因此问题就变成了求满足的正整数解的数量。这是一个经典的问题,可以转换成小球和隔板的问题,俗称隔板法。
把看成个小球,现在有个未知数,看成是个板子,把这个板子插到个空隙里面,一共把小球分成组,每一种摆法都对应方程的一组解(正整数解)。因此解的方案数就等于放隔板的方案数,因此答案就是。
由于这题没有取模,因此需要写高精度。为了方便这里用递推的方法来求组合数,其中的数位有多位,因此计算量为级别。
AC代码如下:
1 #include <bits/stdc++.h> 2 using namespace std; 3 4 const int N = 1010, M = 110; 5 6 vector<int> c[N][M]; 7 8 int qmi(int a, int k, int p) { 9 int ret = 1; 10 while (k) { 11 if (k & 1) ret = ret * a % p; 12 a = a * a % p; 13 k >>= 1; 14 } 15 return ret; 16 } 17 18 void add(vector<int> &c, vector<int> &a, vector<int> &b) { 19 int t = 0; 20 for (int i = 0; i < a.size() || i < b.size(); i++) { 21 if (i < a.size()) t += a[i]; 22 if (i < b.size()) t += b[i]; 23 c.push_back(t % 10); 24 t /= 10; 25 } 26 if (t) c.push_back(t); 27 } 28 29 int main() { 30 int n, m, x; 31 scanf("%d %d", &m, &x); 32 n = qmi(x % 1000, x, 1000); 33 for (int i = 0; i < n; i++) { 34 for (int j = 0; j <= i && j < m; j++) { 35 if (j == 0) c[i][j].push_back(1); // c[i][0] = 1 36 else add(c[i][j], c[i - 1][j], c[i - 1][j - 1]); // c[i][j] = c[i - 1][j] + c[i - 1][j - 1] 37 } 38 } 39 for (int i = c[n - 1][m - 1].size() - 1; i >= 0; i--) { 40 printf("%d", c[n - 1][m - 1][i]); 41 } 42 43 return 0; 44 }
参考资料
AcWing 1308. 方程的解(算法提高课):https://www.acwing.com/video/718/
本文来自博客园,作者:onlyblues,转载请注明原文链接:https://www.cnblogs.com/onlyblues/p/17085623.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效