题目

给出两个正整数N和M, N <= 100, M <= 50, 可以将N分解成若干个不相等的正整数A1, A2... Ak的和,且A1, A2 ... Ak的乘积为M的倍数。即 
N = A1 + A2 + ... + Ak; 
A1*A2*...Ak % M = 0; 
求可以有多少种分解方式? 
题目链接: divided product

分析

直接DFS搜索,DFS(cur_sum, cur_max_num, cur_product) 枚举出总和为N的,且各个数字不断增加的方案,然后判断他们的乘积是否等于M的倍数。实现复杂度为:(2^t, t 为几十的量级),显然不行; 
考虑动态规划来解决: 
    维护状态 dp[i][j][t] 表示 A1,A2...Ak的总和为i,且最大的数字Ak等于j,A1*A2..A*k的结果模M为t的分解方案总个数。 
则可以有递推公式:

  1. int tt = k*t%M;
  2. dp[i + k][k][tt] += dp[i][j][t];
  3. dp[i + k][k][tt] %= mod;

其中需要注意 边界条件 dp[i][i][i%M] = 1.

实现

#include<stdio.h>
#include<string.h>
#include<iostream>
#include<string>
#include<set>
#include<map>
#include<vector>
#include<queue>
#include<stack>
#include<unordered_map>
#include<unordered_set>
#include<algorithm>
using namespace std;
int dp[105][105][55];
int main(){const int mod = 1000000007;int n, m;scanf("%d %d", &n, &m);memset(dp, 0, sizeof(dp));for (int i = 0; i <= n; i++){for (int j = 0; j <= i; j++){for (int k = j + 1; (k + i) <= n; k++){for (int t = 0; t < m; t++){if (i == 0)dp[k][k][k%m] = 1;else{int tt = k*t%m;dp[i + k][k][tt] += dp[i][j][t];dp[i + k][k][tt] %= mod;}}}}}int result = 0;for (int i = 1; i <= n; i++)result = (result + dp[n][i][0]) % mod;printf("%d\n", result);return 0;
}

转载于:https://www.cnblogs.com/gtarcoder/p/5602587.html

最新文章

  1. 如何防止android app被误删除,如何避免手机清理缓存时误删了重要文件【注意事项】...
  2. leetcode算法题--Is Subsequence
  3. 【计算理论】计算理论总结 ( 泵引理 Pumping 证明 ) ★★
  4. 5位无符号阵列乘法器设计_可变位宽的大规模矩阵乘法方法
  5. 用神经网络模拟分子:碱金属的氯化物
  6. EF6源码学习-准备篇
  7. 观察者模式实际例子demo
  8. linux mysql 定时任务_Linux下Mysql定时任务备份数据的实现方法
  9. JavaScript获取地址栏中的链接参数
  10. UVa11809-Floating-Point Numbers
  11. VS调试配置外网可访问
  12. 年度最骚语言之文言文编程!!!
  13. 【银联支付】php接入银联支付
  14. js更新mysql数据库_更新javascript方法
  15. 沧海的孤塔-chimera
  16. GRUB4DOS资源索引帖,欢迎跟帖补充
  17. 王者荣耀英雄测试用例
  18. LaTeX 表格标题位置无法移动的问题
  19. RobotFrameWork Web自动化测试之测试环境搭建
  20. 使用 Vue3 + elementPlus 做一个每日习惯打卡表

热门文章

  1. 【spring bean】bean的配置和创建方式
  2. Python中__init__和__del__方法介绍
  3. Webbench学习笔记一:源码获取和使用
  4. Node.js 中 exports 和 module.exports 的区别
  5. vue学习日志-过滤器
  6. Netty2:粘包/拆包问题与使用LineBasedFrameDecoder的解决方案
  7. sdut 2878 圆圈
  8. Pro Git CN Plus
  9. 《零基础学习Liunx之三》 The following takes place between 04:00PM and 05:00PM
  10. java day61【 SpringMVC 的基本概念 、 SpringMVC 的入门 、 请求参数的绑定 、常用注解 】...