方程的解

方程的解

佳佳碰到了一个难题,请你来帮忙解决。

对于不定方程 a1+a2++ak1+ak=g(x),其中 k1kNx 是正整数,g(x)=xxmod1000(即 xx 除以 1000 的余数),x,k 是给定的数。

我们要求的是这个不定方程的正整数解组数。

举例来说,当 k=3,x=2 时,方程的解分别为:

{a1=1a2=1a3=2  {a1=1a2=2a3=1  {a1=2a2=1a3=1

输入格式

有且只有一行,为用空格隔开的两个正整数,依次为 k,x

输出格式

有且只有一行,为方程的正整数解组数。

数据范围

1k100,
1x<231,
kg(x)

输入样例:

3 2

输出样例:

3

 

解题思路

  假设n=xxmod1000,这个可以用快速幂来求。因此问题就变成了求满足a1+a2++ak=n的正整数解的数量。这是一个经典的问题,可以转换成小球和隔板的问题,俗称隔板法

  把n看成n个小球,现在有k个未知数,看成是k1个板子,把这k1个板子插到n1个空隙里面,一共把小球分成k组,每一种摆法都对应方程的一组解(正整数解)。因此解的方案数就等于放隔板的方案数,因此答案就是Cn1k1

  由于这题没有取模,因此需要写高精度。为了方便这里用递推的方法来求组合数,其中C1000100的数位有150多位,因此计算量为1000×100×150107级别。

  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/

posted @   onlyblues  阅读(67)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效
Web Analytics
点击右上角即可分享
微信分享提示