ACM学习历程—Hihocoder编程之美测试赛B题 大神与三位小伙伴(组合数学 )
描述
给你一个m x n (1 <= m, n <= 100)的矩阵A (0<=aij<=10000),要求在矩阵中选择一些数,要求每一行,每一列都至少选到了一个数,使得选出的数的和尽量的小。
输入
多组测试数据。首先是数据组数T
对于每组测试数据,第1行是两个正整数m, n,分别表示矩阵的行数和列数。
接下来的m行,每行n个整数,之间用一个空格分隔,表示矩阵A的元素。
输出
每组数据输出一行,表示选出的数的和的最小值。
数据范围
小数据:1 <= m, n <= 5
大数据:1 <= m, n <= 100
- 样例输入
-
2
3 3
1 2 3
3 1 2
2 3 1
5 5
1 2 3 4 5
5 1 2 3 4
4 5 1 2 3
3 4 5 1 2
2 3 4 5 1 - 样例输出
-
Case 1: 3
Case 2: 5
题目大意是有三类纪念品A、B、C。每类纪念品又有N种不同的纪念品Ai、Bi、Ci(1 <= i <= N),然后对于Ai纪念品的剩余个数CAi是N+1-i个,对于Bi纪念品的剩余个数CBi是N+1-i个,Ci纪念品的剩余个数CCi是N+1-i个。
要求拿出三件纪念品Ap, Bq, Ck,不能恰好有两件价值相同,求取法数。
可以从两个角度考虑:
(1) 从正面角度考虑:
不能恰好有两件价值相同,那么就是三件价值都相同或者都不同。
1. 三件价值都相同:
假设我都取价值为i的纪念品,那么就有CAi*CBi*CCi可以取(CAi、CBi、CCi分别为Ai、Bi、Ci剩余个数)
所以总数便是

2.三件价值都不同:
假设我A取了价值为i的纪念品,那么有CAi种;
那么B不能取价值为i的,假设B取了价值为j的,有CBj种;
那么C不能取价值为i和j的。
所以总数便是

此处说明一下,第一个式子是取A乘取B乘取C(取C是在C总数的基础上减去价值为i和j的)
第二个式子就是第一个式子变形的,将n+1-i替换为i’,同理的j和k。
第三个式子就是把i != j这个条件体现出来。
接下来进一步化简:

所以总的就是上面两种情况相加,得到

然后由下面三组式子便可以求解:

(2) 从反面角度考虑:
不能恰好有两件价值相同,那么就是总选数里面减去它就OK了。
总选数自然就是:

恰好有两件价值相同,那么就先从ABC三个里选出两种准备选价值相同的i,选法有C(2, 3),即3种。
然后剩余的一个不能选价值为i的,所以总数:

所以最后答案就是:

与第一种方法的答案一致。
代码:
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <set>
#include <map>
#include <vector>
#include <queue>
#include <string>
#define inf 0xfffffff
#define eps 1e-10
#define N 1000000007 using namespace std; long long n, C1, C2; void Init()
{
n %= N;
C1 = (n+)*n/;
C1 %= N;
C2 = (n+)*n/;
if (C2% == )
{
C2 /= ;
C2 %= N;
C2 *= *n+;
C2 %= N;
}
else
{
C2 %= N;
C2 *= (*n+)/;
C2 %= N;
}
} long long ans()
{
long long s = (C1*C1) % N;
s = (s*C1)%N + (*s)%N - (*((C1*C2)%N))%N;
return (s%N+N)%N;
} int main()
{
//freopen("test.txt", "r", stdin);
int T;
scanf("%d", &T);
for (int times = ; times <= T; ++times)
{
scanf("%lld", &n);
printf("Case %d: ", times);
Init();
printf("%lld\n", ans());
}
return ;
}
ACM学习历程—Hihocoder编程之美测试赛B题 大神与三位小伙伴(组合数学 )的更多相关文章
- ACM学习历程—Hihocoder 1233 Boxes(bfs)(2015北京网赛)
hihoCoder挑战赛12 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 There is a strange storehouse in PKU. In this ...
- ACM学习历程—Hihocoder [Offer收割]编程练习赛1
比赛链接:http://hihocoder.com/contest/hihointerview3/problem/1 大概有一个月没怎么打算法了.这一场的前一场BC,也打的不是很好.本来Div1的A和 ...
- ACM学习历程—Hihocoder 1291 Building in Sandbox(dfs && 离线 && 并查集)
http://hihocoder.com/problemset/problem/1291 前几天比较忙,这次来补一下微软笔试的最后一题,这题是这次微软笔试的第四题,过的人比较少,我当时在调试B题,没时 ...
- ACM学习历程—Hihocoder 1139 二分·二分答案(bfs)
http://hihocoder.com/problemset/problem/1139 这题提示上写的是二分,但是感觉不二分应该也可以,至少题目是AC的... 二分的思想就是二分答案的值,看能不能在 ...
- ACM学习历程—Hihocoder 1289 403 Forbidden(字典树 || (离线 && 排序 && 染色))
http://hihocoder.com/problemset/problem/1289 这题是这次微软笔试的第二题,过的人比第三题少一点,这题一眼看过去就是字符串匹配问题,应该可以使用字典树解决.不 ...
- ACM学习历程—Hihocoder 1290 Demo Day(动态规划)
http://hihocoder.com/problemset/problem/1290 这题是这次微软笔试的第三题,过的人比第一题少一点,这题一眼看过去就是动态规划,不过转移方程貌似不是很简单,调试 ...
- ACM学习历程—Hihocoder 1288 Font Size(暴力 || 二分)
http://hihocoder.com/problemset/problem/1288 这题是这次微软笔试的第一题,关键的是s的上限是min(w, h),这样s的范围只有到1000,这样就可以直接暴 ...
- ACM学习历程—Hihocoder 1164 随机斐波那契(数学递推)
时间限制:5000ms 单点时限:1000ms 内存限制:256MB 描述 大家对斐波那契数列想必都很熟悉: a0 = 1, a1 = 1, ai = ai-1 + ai-2,(i > 1). ...
- ACM学习历程—Hihocoder 1178 计数(位运算 && set容器)(hihoCoder挑战赛12)
时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 Rowdark是一个邪恶的魔法师.在他阅读大巫术师Lich的传记时,他发现一类黑魔法来召唤远古生物,鱼丸. 魔法n能召 ...
随机推荐
- Windows 10 1703创意者更新官方ISO镜像大全
2017年04月07日 20:00 19867 次阅读 稿源:快科技 12 条评论 Windows 10 Creators Update创意者更新正式版已经发布,目前只能通过易生.MCT工具或者ISO ...
- 软件工程第2次作业——Visual Studio 2017下基于C/C++的VSTS单元测试实践
Write one minute, test all day long. 环境确定 IDE:Microsoft Visual Studio 2017 Community 语言:C++ 单元测试工具:V ...
- 史上最浅显易懂的Git教程2 github
Git是分布式版本控制系统,同一个Git仓库,可以分布到不同的机器上.怎么分布呢?最早,肯定只有一台机器有一个原始版本库,此后,别的机器可以“克隆”这个原始版本库,而且每台机器的版本库其实都是一样的, ...
- JDK设置Encoding编码格式
执行JAVA程序报错内容如下: java.lang.IllegalStateException: The Java Virtual Machine has not been configured to ...
- SQLServer -- SQL Server Database Error: 内部 SQL Server 错误
报表在SQLserver2008运行统计正常,但是在SQLserver2000运行报错,SQL直接执行报:内部 SQL Server 错误. 不断的排查,最终得到的结论是:SQLserver2000似 ...
- C#连接Oracle的问题(不安装客户端)
win7环境,本地没有安装oracle或者客户端,现在需要程序里连接远程oracle DB: 如果采用System.Data.OracleClient肯定是不行的,这个要安装客户端的: 所以就尝试O ...
- iOS界面-仿网易新闻左侧抽屉式交互 续(添加新闻内容页和评论页手势)
本文转载至 http://blog.csdn.net/totogo2010/article/details/8637430 1.介绍 有的博友看了上篇博文iOS界面-仿网易新闻左侧抽屉 ...
- net上传文件的三种方法
ASP.NET依托.net framework类库,封装了大量的功能,使得上传文件非常简单,主要有以下三种基本方法. 方法一:用Web控件FileUpload,上传到网站根目录. Test.aspx关 ...
- Python中的staticmethod和classmethod
谈谈Python中的staticmethod和classmethod 首先值得说明的是staticmethod和classmethod都是python中定义的装饰器,用的时候需要在前面加@ 即@sta ...
- 支付宝异步通知notify_url接收不了问题解决(转)
此处return_url可以成功跳转回网站页面但notify_url却接收不到支付宝的异步通知.已保证notify_url是一个外网可以访问的网址 1.网站用的是ssh框架,当支付宝发通知到我这个ac ...