【问题描述】
你是能看到第二题的friends呢。
——laekov
Hja和Yjq在玩游戏,这个游戏中Hja给了Yjq两个数,希望Yjq找到一些非负整数使得这些数的和等于n,并且所有数模maaaaaaaaaaaaaa       的值互不相同,求方案数。
【输入格式】
一行两个整数。
【输出格式】
一行一个整数代表答案对取模之后的结果。
【样例输入1】
3 3
【样例输出1】
9
【样例输入2】
523 44
【样例输出2】
338398304
【数据规模与约定】
对于100%的数据, n<=1e18 ,m<=100

题解:

      ①根据题意列出构造背包体积的式子:
            a1+a2+a3……+ak=n  然后%m得到:

            b1+b2+b3……+bk=n'(其中:bi=ai%m,n'=n%m)

      ②那么由于m的范围:  0<=bi<m 此时可以进行背包,物品体积独一无二。

      ③又因为∑bi 的最大值为:1+2+3+……+(m-1)=m*(m-1)/2 ,注意到可能会超过m

      ④令f[i][j]表示总共用了i个物品构造体积为j的方案数,就正常的背包DP转移就是了。

      ⑤此时的结果是取模下的结果,又因为:n=n'+k*m ,相当于物品总共还要增加k*m的权值

      ⑥由于状态记录了物品个数,也就是将k个m分给i个物品,此处为组合数计数(插隔板…)

      ⑦这道题由于要求内部组合顺序算作不同方案,因此需要乘上排列数。

      ⑧总结上述方法,答案为∑f[i][j]*C(插隔板)*(i!) (1<=i<=m,j=n%m+k*m且j<=m*(m-1)/2)

      ⑨主程序化简递推组合数式子可达O(n3),但是预处理依旧是O(n4),不要相信时间复杂度。

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
#ifdef unix
#define LL "%lld"
#else
#define LL "%I64d"
#endif
const int maxn=110;
const int maxs=maxn*maxn/2;
const int mo=905229641;
long long n;
int m,f[maxn][maxs],fac[maxn];
int calc(long long a,long long b)
{long long ans=1;for(int c=1;c<a;c++)ans=ans*(b+c)%mo;return (int)ans;
}int main()
{scanf(LL "%d",&n,&m);f[0][0]=1;int up=m*(m-1)/2;for (int a=0;a<m;a++)for (int b=m;b>=0;b--)for (int c=up;c>=0;c--)if (f[b][c]) f[b+1][c+a]=(f[b+1][c+a]+f[b][c])%mo;fac[0]=1;for (int a=1;a<=m;a++)fac[a]=(long long)fac[a-1]*a%mo;int x=(int)(n%m);int ans=0;for (int a=x;a<=n && a<=up;a+=m){long long rest=(n-a)/m;for (int b=1;b<=m;b++)if (f[b][a]){int nowans=calc(b,rest%mo);nowans=(long long)nowans*f[b][a]%mo;nowans=(long long)nowans*b%mo;ans=(ans+nowans)%mo;}}printf("%d\n",ans);return 0;
}//Ztraveler

桌上那张发黄的相片,唤起我心中无尽的思念,

我终于失去你的那一天,我才明白你就是永远……——————汪峰《窗台》

         

转载于:https://www.cnblogs.com/Damitu/p/7660851.html

【ZBH选讲·模数和】相关推荐

  1. 【ZBH选讲·树变环】

    [问题描述] 你是能看到第三题的friends呢. --aoao 树是个好东西,删掉树一条边要1的代价,随便再加一条边有1的代价,求最小的代价把树变成环. [输入格式] 第一行一个整数,代表树的点数. ...

  2. 【ZBH选讲·拍照】

    [问题描述] 假设这是一个二次元. LYK召集了n个小伙伴一起来拍照.他们分别有自己的身高Hi和宽度Wi. 为了放下这个照片并且每个小伙伴都完整的露出来,必须需要一个宽度为ΣWi,长度为max{Hi} ...

  3. UA CSC696H 强化学习理论选讲1 强化学习概览

    UA CSC696H 强化学习理论选讲1 强化学习概览 强化学习相关概念 Markov Decision Processes(MDP)简介 Policy Evaluation 强化学习(reinfor ...

  4. 练习图200例图纸讲解_【宅家数学课23】经典微课6:苏教版六年级下册比例尺典型例题选讲及练习(含答案)...

    (截止日期:3月31日) 学习过程 1.点击观看经典微课: 微课视频 <比例尺> 2.认真学习典型例题,完成下方练习题 3.查看答案,在家长指导下批改,订正错误. 苏教版小学数学六年级下册 ...

  5. C++11新特性选讲 语言部分 侯捷

    C++11新特性选讲 语言部分 侯捷 本课程分为两个部分:语言的部分和标准库的部分.只谈新特性,并且是选讲. 本文为语言部分笔记. 语言 Variadic Templates move semanti ...

  6. 20190509杂题选讲

    这次杂题选讲好多思维题神仙题啊= =顺便学了波线段树上二分= = Normal 题目大意戳这 CF1083C CDW讲的神仙题*1 题解戳这 AGC002E 我讲的题,是个人写的程序都比我写的程序跑得 ...

  7. PJ可能会用到的动态规划选讲-学习笔记

    PJ可能会用到的动态规划选讲-学习笔记 by Pleiades_Antares 难度和速度全部都是按照普及组来定的咯 数位状压啥就先不讲了 这里主要提到的都是比较简单的DP 一道思维数学巧题(补昨天) ...

  8. [统计学笔记] 统计学计算题选讲(精华)

    统计学计算题选讲 第 1 题 某班级学生物理课程考试成绩分别为:              68  89  88  84  86  87  75  73  72  68              75 ...

  9. 4.4 竞赛题目选讲

    竞赛题目选讲 这里的题目可能和大家在做的实验项目有些不太一样,希望大家根据自己的需要阅读本章节. 4-2 刽子手游戏 (UVA 489) 书上的题面少了一些很重要的东西,真正的题面请点开这里 分析:根 ...

最新文章

  1. Spark2.1.0之初识Spark
  2. 关于HashCode方法,可变对象和内存泄漏问题
  3. 学习编程的25个“坑”,你踩到了吗?
  4. python弹出警告框_selenium+webdriver+python 中警告框的处理方法
  5. mysql分别写出3条索引_MySQL3:索引
  6. Cpp 对象模型探索 / 静态局部对象只构造一次的原因和执行析构的方法
  7. 启动Cognos时报0106错误
  8. arry-718 Maximum Length of Repeated Subarray
  9. java string.substring 参数,Java,String类中的subString()方法,stringsubstring
  10. 联发科固件现窃听漏洞,影响全球约三分之一的手机和物联网设备
  11. 进阶10 补充知识点
  12. BC 2015在百度之星程序设计大赛 - 预赛(1)(KPI-树董事长)
  13. 为什么重复率高的字段不适合作为索引
  14. chm打开秒退_求教hmcl启动器1.12.2非正常退出问题(百度过了,都不行)
  15. 计算机编程语言及C语言简介,编程语言基础:C语言
  16. 为什么要用babylonJS
  17. java ios内购凭证_iOS内购看我就够了(含代码)
  18. 简单的二维码生成接口,自动生成二维码,返回图片地址
  19. SV学习笔记—变量及数组随机化约束常犯的错误
  20. python开发项目:学生选课系统

热门文章

  1. 【C++学习笔记】复合类型和const限定符
  2. 用keil编写C语言流水灯程序,简述关于Keil、STM32 用C++编写流水灯程序
  3. GitHub界面各个页签作用
  4. Webstorm 分屏操作
  5. pyscripter与python的关系_Codecademy Python和Pyscripter提供错误消息
  6. 某广告SDK流量加解密-响应
  7. 利用电子邮件“钓鱼”的常见手段
  8. SQL中destinct的用法
  9. #442 不叁不肆:独居,阳了,没事,快好了
  10. 受损固态硬盘(SSD)数据恢复方法(福利:固态硬盘免费恢复数据)