http://www.ifrog.cc/acm/problem/1032

1032 - A-B

Time Limit:1s Memory Limit:128MByte

Submissions:680Solved:126

DESCRIPTION

你有nn个球,需要把他们放到mm个盒子里。
要求拥有最多球的盒子唯一,问方案数。

INPUT
一行两个数n,mn,m.(n,m≤500n,m≤500)
OUTPUT
一行一个数,表示方案数。
答案对9982443533取模。
SAMPLE INPUT
5 2
SAMPLE OUTPUT
6
今天补了这题,是以前一直遗漏的题,还是最怕的题。
但是离散数学老师真的教了我很多这些方程的解的个数。thx~
要做这题,可以先做这题。
 
这题可以考虑用容斥原理来解。
首先,暴力枚举,假如1号箱子的球的数量是最多,设为val
那么原问题是x1 + x2 + x3 + x4 .... + xm = n的。设定了1号最多而且是val的话
就是x2 + x3 + x4 + ..... + xm = n - val的解,其中 0 <= xi < val
这个问题的解,要用容斥原理。
先求出这个问题,一共有多少个解,就是先管0 <= xi。显然是C(n - val + m - 2, m - 2)个、如果这个不懂的话,
可以看看这个
但是有很多不符合的解。
然后暴力枚举有k个数是大于等于val的,这些就是不合法的解了。对于奇数个,我们将其减去,偶数个,加上来。
 
注意判断m = 1的话,ans = 1.因为我这里是用到了m - 2,所以你、m要>=2
然后这只是最大值在1号时候的情况。所以最后要乘上m。
 
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <assert.h>
#define IOS ios::sync_with_stdio(false)
using namespace std;
#define inf (0x3f3f3f3f)
typedef long long int LL; #include <iostream>
#include <sstream>
#include <vector>
#include <set>
#include <map>
#include <queue>
#include <string>
const int MOD = ;
LL quick_pow(LL a, LL b, LL MOD) { //求解 a^b%MOD的值
LL base = a % MOD;
LL ans = ; //相乘,所以这里是1
while (b) {
if (b & ) {
ans = (ans * base) % MOD; //如果这里是很大的数据,就要用quick_mul
}
base = (base * base) % MOD; //notice。注意这里,每次的base是自己base倍
b >>= ;
}
return ans;
} LL C(LL n, LL m, LL MOD) {
if (n < m) return ; //防止sb地在循环,在lucas的时候
if (n == m) return ;
LL ans1 = ;
LL ans2 = ;
LL mx = max(n - m, m); //这个也是必要的。能约就约最大的那个
LL mi = n - mx;
for (int i = ; i <= mi; ++i) {
ans1 = ans1 * (mx + i) %MOD;
ans2 = ans2 * i % MOD;
}
return (ans1 * quick_pow(ans2, MOD - , MOD) % MOD); //这里放到最后进行,不然会很慢
}
int n, m;
void work() {
int n, m;
cin >> n >> m;
if (m == ) {
cout << << endl;
return;
}
assert(n > );
assert(m > );
LL ans = ;
for (int val = ; val <= n; ++val) {
LL tans = C(n - val + m - , m - , MOD);
for (int k = ; k <= m - ; ++k) {
if (k & ) {
tans = (tans + MOD - C(m - , k, MOD) * C(n - val - k * val + m - , m - , MOD) % MOD) % MOD;
} else {
tans = (tans + C(m - , k, MOD) * C(n - val - k * val + m - , m - , MOD) % MOD) % MOD;
}
}
ans += tans;
assert(ans >= );
ans %= MOD;
}
assert(ans * m >= );
cout << (ans * m) % MOD << endl;
} int main() {
#ifdef local
freopen("data.txt", "r", stdin);
// freopen("data.txt", "w", stdout);
#endif
work();
return ;
}

1032 - A-B 组合数学的更多相关文章

  1. sqlservr (708) 打开日志文件 C:\Windows\system32\LogFiles\Sum\Api.log 时出现错误 -1032 (0xfffffbf8)

    在windows server 2012 standard上新安装好的SQL Server 2014,查看错误日志,发现此报错 sqlservr (708) 打开日志文件 C:\Windows\sys ...

  2. Light OJ 1032 - Fast Bit Calculations(数学)

    题目链接:http://www.lightoj.com/volume_showproblem.php?problem=1032 题目大意:一个十进制数变化为二进制,那么对于这个数,如果连着两个二进制位 ...

  3. 1032: [JSOI2007]祖码Zuma

    链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1032 Description 这是一个流行在Jsoi的游戏,名称为祖玛.精致细腻的背景,外加神 ...

  4. poj 3734 Blocks 快速幂+费马小定理+组合数学

    题目链接 题意:有一排砖,可以染红蓝绿黄四种不同的颜色,要求红和绿两种颜色砖的个数都是偶数,问一共有多少种方案,结果对10007取余. 题解:刚看这道题第一感觉是组合数学,正向推了一会还没等推出来队友 ...

  5. loj 1032 数位dp

    题目链接:http://lightoj.com/volume_showproblem.php?problem=1032 思路:数位dp, 采用记忆化搜索, dp[pos][pre][have] 表示 ...

  6. PAT乙级 1032. 挖掘机技术哪家强(20)

    1032. 挖掘机技术哪家强(20) 时间限制 200 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 为了用事实说明挖掘机技术到底 ...

  7. [MySQL] SQL_ERROR 1032解决办法

    一.缘由: 在主主同步的测试环境,由于业务侧没有遵循同一时间只写一个点的原则,造成A库上删除了一条数据,B库上在同时更新这条数据. 由于异步和网络延时,B的更新event先到达A端执行,造成A端找不到 ...

  8. 组合数学or not ---- n选k有重

    模板问题: 1. 取物品 (comb.pas/c/cpp) [问题描述] 现在有n个物品(有可能相同),请您编程计算从中取k个有多少种不同的取法.[输入] 输入文件有两行,第一行包含两个整数n,k(2 ...

  9. 组合数学(全排列)+DFS CSU 1563 Lexicography

    题目传送门 /* 题意:求第K个全排列 组合数学:首先,使用next_permutation 函数会超时,思路应该转变, 摘抄网上的解法如下: 假设第一位是a,不论a是什么数,axxxxxxxx一共有 ...

随机推荐

  1. C语言中的 extern 关键字

    今天在 BLE 中看到很多 extern 关键字,现在总结一下: extern 关键字主要用于在一个c文件中要用到另一个c文件中的变量或者函数. example: #extern_base.c ; # ...

  2. Mvc4系列文章

    http://www.cnblogs.com/duanshuiliu/tag/MVC/

  3. Base64编码解码

    一. Base64编码由来 为什么会有Base64编码呢?因为有些网络传送渠道并不支持所有的字节,例如传统的邮件只支持可见字符的传送,像ASCII码的控制字符就不能通过邮件传送.这样用途就受到了很大的 ...

  4. Mysql 自定义HASH索引带来的巨大性能提升----[真相篇]

    推倒重来 俗话说no zuo no die why you try,这时候我又忍不住zuo了,吭哧吭哧的把解决过程发上博客,向全世界宣布,哥又搞定个难题. 剧情的发展往往是看起来主角完全掌握了局势的情 ...

  5. ORACLE创建表之前判断表是否存在与SQL Server 对比使用

    在SQL Server 数据库中,我们在创建表之前删除表,有if exit()这样的语句,但是在oracle中却没有.如果直接使用drop table那么如果表不存在会报错,导致后续语句无法运行.因此 ...

  6. Hive操作表部分总结

    创建表: create table tableName(time INT,userid BIGINT,url STRING,ip STRING COMMENT 'IP Address of the U ...

  7. redis shell命令大全

    redis shell命令大全(转自http://blog.mkfree.com/posts/5105432f975ad0eb7d135964) 作者:oyhk   2013-1-28 3:11:35 ...

  8. centos修改hostname以及时间同步

    centos修改hostname 方法一: 执行命令:hostname test 则修改hostname为test 方法二: 永久修改hostname vi /etc/sysconfig/networ ...

  9. 每天一个 Linux 命令(12):more命令

    more命令,功能类似 cat ,cat命令是整个文件的内容从上到下显示在屏幕上. more会以一页一页的显示方便使用者逐页阅读,而最基本的指令就是按空白键(space)就往下一页显示,按 b 键就会 ...

  10. MyEclipse中查询

    在当前文件中查询: Ctrl + F 在整个项目中查询:   Ctrl + H(选File Search)