一本通1650:【例 3】组合

#include <stdio.h>
#define ll long long
ll pow(ll s, ll n, ll mod) {
    ll res = 1;

    while (n) {
        while (n % 2 == 0) {
            s = (s * s) % mod;
            n /= 2;
        }

        res = (res * s) % mod;
        n--;
    }

    return res;
}
ll C(ll m, ll n, ll mod) {
    ll res = 1, t = 1, i;

    for (i = 0; i < m; i++) {
        res = res * (n - i) % mod;
        t = t * (i + 1) % mod;
    }

    return res * pow(t, mod - 2, mod) % mod;
}
ll lukaer(ll m, ll n, ll mod) {
    return m ? C(m % mod, n % mod, mod) * lukaer(m / mod, n / mod, mod) % mod : 1;
}
int main() {
    ll n, m, p, t;
    scanf("%lld", &t);

    while (t--) {
        scanf("%lld%lld%lld", &n, &m, &p);
        printf("%lld\n", lukaer(m, n, p));
    }

    return 0;
}

### 关于「一本 1.3 1」数的划分 #### 题目描述 给定一个正整数 n 和 k,试求将这个正整数划分为若干个正整数之和的不同方案总数。每个分拆方案中的加数顺序无关紧要。 #### 考点分析 此题属于组合数学范畴内的整数分拆问题,同时也可视为一个多阶段决策最优化的过程[^3]。过动态规划的方法可以有效地解决此类问题,在每一个阶段做出最优的选择来构建最终解。 #### 动态规划模型建立 定义 `f[i][j]` 表示把 i 划分成最多 j 份的最大数目,则状态转移方程如下: 当 `i >= j * (j + 1) / 2` 时, \[ f[i][j]=\sum_{k=0}^{min(i,j)}{f[i-k][k]} \] 边界条件为: - 当 `i == 0` 时, 只有一种情况即不取任何元素; - 对于所有的 `i`, 如果 `j==0` ,则无合法分割方式; 因此初始化设置为 `f[0][*]=1; f[*][0]=0`. #### 实现细节说明 为了提高效率并减少不必要的计算量,采用记忆化搜索的方式实现上述算法逻辑。同时考虑到空间复杂度的要求,实际编码过程中仅需维护两个数组用于存储当前层与上一层的状态即可完成迭代更新操作。 ```cpp #include <iostream> using namespace std; const int MAXN = 2e2 + 5; int dp[MAXN][MAXN]; void init() { for(int i = 0 ; i < MAXN ; ++i){ dp[0][i] = 1; dp[i][0] = 0; } } // 记忆化搜索函数 int dfs(int sum,int maxVal){ if(sum<0 || maxVal<=0)return 0; if(dp[sum][maxVal]!=-1)return dp[sum][maxVal]; int res = dfs(sum,maxVal-1); if(maxVal<=sum) res += dfs(sum-maxVal,maxVal); return dp[sum][maxVal]=(res%(1e9+7)); } int main(){ memset(dp,-1,sizeof(dp)); init(); int N,K; cin>>N>>K; cout<<dfs(N,K)<<endl; } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值