清北学堂模拟赛d4t2 b

分析:比较复杂的一题.
首先要求k个mod m互不相同且和为n的数ai,我们可以转化为求和为k个bi,并且(Σbi) % m = n % m
其中bi=ai % m,接下来可以用dp求出选了i个b,和为j的方案数.用f[i][j]表示状态.但是这样可能会让bi重复,一个解决办法是再加上一维,不过这是不必要的,我们只需要先枚举当前的数是哪一个,之后再倒序枚举i,j就可以了.我们知道b的方案数,ai = ki*m + bi,接下来知道ki的方案数就可以了.因为Σai = Σki*m + bi,所有式子全部加起来,就变成了n = (Σki) * m + Σbi,化简一下,可以得到(n - s) / m = Σki,设(n - s) / m = t,接下来的任务就是把t这个数分配给ki,这是隔板法的经典应用,假设有l个k,那么方案数就是C(l + t - 1,t - 1),最后乘上f数组.这样的话求组合数比较麻烦,还要求逆元,注意到我们前面的f[i][j]的求法是假定b1 < b2 < ...... bk的,所以有k!种排列方法,要在答案最后乘上k!,就全部转变为了乘法
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm> using namespace std; const int maxn = , mod = ;
const int maxm = (maxn - ) * maxn / ; typedef long long ll;
ll n, m, f[maxn][maxm], jiecheng[maxn], maxx, ans; ll C(ll a, ll b)
{
ll res = ;
for (ll i = ; i < a; i++)
res = res * (b + i) % mod;
return res;
} int main()
{
scanf("%lld%lld", &n, &m);
maxx = (m - ) * m / ;
f[][] = ;
for (int i = ; i < m; i++)
for (int j = m; j >= ; j--)
for (int k = maxx; k >= ; k--)
if (f[j][k])
f[j + ][k + i] = (f[j + ][k + i] + f[j][k]) % mod;
jiecheng[] = ;
for (int i = ; i <= m; i++)
jiecheng[i] = (jiecheng[i - ] * i) % mod;
ll minx = n % m;
for (ll i = minx; i <= min(n, maxx); i += m)
{
ll t = (n - i) / m;
for (int j = ; j <= m; j++)
if (f[j][i])
{
ll temp = C(j, t % mod);
temp = (temp * f[j][i]) % mod;
temp = (temp * j) % mod;
ans = (ans + temp) % mod;
}
}
printf("%lld\n", ans); return ;
}
清北学堂模拟赛d4t2 b的更多相关文章
- 清北学堂模拟赛day7 数字碰撞
/* clj:水题别人都满分你不是你就完了,所以说水题一定要细心一点,有这么几个细节:①前导零的处理,全是零的时候要特判②换行要注意,不要多大一行,剩下就是水水的模拟了 */ #include< ...
- 清北学堂模拟赛d4t1 a
分析:大模拟,没什么好说的.我在考场上犯了一个超级低级的错误:while (scanf("%s",s + 1)),导致了死循环,血的教训啊,以后要记住了. /* 1.没有发生改变, ...
- 清北学堂模拟赛day7 错排问题
/* 考虑一下已经放回m本书的情况,已经有书的格子不要管他,考虑没有书的格子,不考虑错排有(n-m)!种,在逐步考虑有放回原来位置的情况,已经放出去和已经被占好的格子,不用考虑,剩下全都考虑,设t=x ...
- 清北学堂模拟赛day7 石子合并加强版
/* 注意到合并三堆需要枚举两个端点,其实可以开一个数组记录合并两堆的结果,标程好像用了一个神奇的优化 */ #include<iostream> #include<cstdio&g ...
- 清北学堂模拟赛d6t6 棋盘迷宫
3.棋盘迷宫(boardgame.pas/c/cpp)(boardgame.in/out)时间限制:5s/空间限制:256M[题目描述]小 A 和小 Z 是非常要好的朋友, 而且他们都对迷宫游戏非常有 ...
- 清北学堂模拟赛d1t2 火柴棒 (stick)
题目描述众所周知的是,火柴棒可以拼成各种各样的数字.具体可以看下图: 通过2根火柴棒可以拼出数字“1”,通过5根火柴棒可以拼出数字“2”,以此类推. 现在LYK拥有k根火柴棒,它想将这k根火柴棒恰好用 ...
- 清北学堂模拟赛d1t1 位运算1(bit)
题目描述LYK拥有一个十进制的数N.它赋予了N一个新的意义:将N每一位都拆开来后再加起来就是N所拥有的价值.例如数字123拥有6的价值,数字999拥有27的价值.假设数字N的价值是K,LYK想找到一个 ...
- 清北学堂模拟赛d2t6 分糖果(candy)
题目描述总共有n颗糖果,有3个小朋友分别叫做L,Y,K.每个小朋友想拿到至少k颗糖果,但这三个小朋友有一个共同的特点:对3反感.也就是说,如果某个小朋友拿到3颗,13颗,31颗,333颗这样数量的糖果 ...
- 清北学堂模拟赛d2t5 吃东西(eat)
题目描述一个神秘的村庄里有4家美食店.这四家店分别有A,B,C,D种不同的美食.LYK想在每一家店都吃其中一种美食.每种美食需要吃的时间可能是不一样的.现在给定第1家店A种不同的美食所需要吃的时间a1 ...
随机推荐
- [HNOI2011]XOR与路径
https://zybuluo.com/mdeditor#1094266 标签(空格分隔): 高斯消元 期望 题面 从 1 号节点开始,以相等的概率,随机选择与当前节点相关联的某条边,并沿这条边走到下 ...
- 开发PL/SQL子程序和包及使用PL/SQL编写触发器、在JDBC中应用Oracle
1. 子程序的各个部分: 声明部分.可执行部分.异常处理部分(可选) 2.子程序的分类: A. 过程 - 执行某些操作 a. 创建过程的语法: CREATE [OR REPLACE] PROC ...
- Java的安装过程
记录一下自己在Windowns下安装java的过程 安装网址:http://www.oracle.com/index.html 打开网址后要先登录,如果没有号就先注册,然后才能下载 step1:下载J ...
- [App Store Connect帮助]三、管理 App 和版本(2.1)输入 App 信息:查看和编辑 App 信息
在您添加 App 至您的帐户后,您也可以在“我的 App”部分查看和编辑 App 信息和平台版本信息. 在输入 App 信息前,请检查必填项.可本地化和可编辑属性.您在上传构建版本或提交您的 App ...
- 【转】mysql的数据类型
转自:http://mrxiong.blog.51cto.com/287318/1651098 一.数值类型 Mysql支持所有标准SQL中的数值类型,其中包括严格数据类型(INTEGER,SMALL ...
- springboot自定义常量配置
现在你建一个类: import org.springframework.boot.context.properties.ConfigurationProperties; /** * Created b ...
- Spring Cloud (9) 服务容错保护-Hystrix断路器
断路器 断路器本身是一种开关装置,用于在电路上保护线路过载,当线路中又电路发生短路时,断路器能够及时的切断故障电路,放置发生过载.发热.甚至起火等严重后果. 在分布式架构中,断路器模式的作用也是类似, ...
- 关于华为手机Log.d打印不出来log的问题
http://blog.csdn.net/picasso_l/article/details/52489560 拨号,进入后台设置,进行操作.
- html5——DOM扩展
元素获取 1.document.getElementsByClassName ('class') 通过类名获取元素,以类数组形式存在. 2.document.querySelector(‘div’) ...
- 微信小程序获取二维码并把logo替换为自己的头像
$avatarUrl = 'http://cms-bucket.nosdn.127.net/2018/05/28/a1a44ffdc2d24f928c1860d4fbf54703.jpeg?image ...