(完整版)2012福建省信息学奥林匹克CCF NOIP夏令营竞赛(附解题思路及参考程序)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2012福建省信息学奥赛CCF NOIP夏令营
竞赛时间:8:30 – 11:30
(附解题思路及参考程序)
福建省计算机学会
花园(garden)
【问题描述】
小L有一座环形花园,沿花园的顺时针方向,他把各个花圃编号为1~N(2<=N<=1015)。
他的环形花园每天都会换一个新花样,但他的花园都不外乎一个规则,任意相邻M(2<=M〈=5,M〈=N)个花圃中有不超过K(1〈=K 〈M)个C形的花圃,其余花圃均为P形的花圃。
例如,N=10,M=5,K=3。
则
CCPCPPPPCC 是一种不符合规则的花圃;
CCPPPPCPCP 是一种符合规则的花圃.
请帮小L求出符合规则的花园种数Mod 1000000007
由于请您编写一个程序解决此题。
【输入文件】
一行,三个数N,M,K.
【输出文件】
花园种数Mod 1000000007
【样例输入1】
10 5 3
【样例输出1】
458
【样例输入2】
6 2 1
【样例输出2】
18
【数据规模】
40%的数据中,N<=20;
60%的数据中,M=2;
80%的数据中,N〈=105。
扑克牌(poker)
【问题描述】
组合数学是数学的重要组成部分,是一门研究离散对象的科学,它主要研究满足一定条件的组态(也称组合模型)的存在、计数以及构造等方面的问题。
组合数学的主要内容有组合计数、组合设计、组合矩阵、组合优化等。
随着计算机科学的日益发展,组合数学的重要性也日渐凸显,因为计算机科学的核心内容是使用算法处理离散数据.
今天我们来研究组合数学中的一个有趣的问题,也是一个简单的计数问题:
从一副含有n(n≤10000)张的扑克牌[显然每张扑克牌都不相同]中,分给m(m≤100)个人,第i个人得到a i (0≤ai≤100)张牌,求一共有几种分法,这个数可能非常大,请输出此数模10007后的结果。
【输入文件】
第一行两个整数为 n m
第二行 m个整数 ai
【样例输入1】
5 2
3 1
【样例输出1】
20
【样例输入2】
20 19
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
【样例输出2】
8707
【数据规模】对于50%的数据,M = 1。
租用游艇(boat)
【问题描述】
长江游艇俱乐部在长江上设置了n 个游艇出租站1,2,…,n。
游客可在这些游艇出租站租用游艇,并在下游的任何一个游艇出租站归还游艇。
游艇出租站i 到游艇出租站j 之间的租金为r(i,j),1〈=i<=j〈=n。
试设计一个算法,计算出从游艇出租站1 到游艇出租站n 所需的最少租金。
对于给定的游艇出租站i 到游艇出租站j 之间的租金为r(i,j),1〈=i<j<=n,编程计算从游艇出租站1 到游艇出租站n所需的最少租金.
保证计算过程中任何时刻数值都不超过106
【输入文件】
由文件提供输入数据。
文件的第1 行中有1 个正整数n(n〈=200),表示有n个游艇出租站.接下来的n—1 行是一个半矩阵r(i,j),1〈=i〈j〈=n。
【输出文件】
程序运行结束时,将计算出的从游艇出租站1 到游艇出租站n所需的最少租金输出到文件中。
【输入样例】
3
5 15
7
【输出样例】
12
均衡发展(balance)
【问题描述】
神牛小R在许多方面都有着很强的能力,具体的说,他总共有m种能力,并将这些能力编号为1到m。
他的能力是一天一天地提升的,每天都会有一些能力得到一次提升,R对每天的能力提升都用一个数字表示,称之为能力提升数字,比如数字13,转化为二进制为1101,并且从右往左看,表示他的编号为1,3,4的能力分别得到了一次提升。
小R把每天表示能力提升的数字的记了下来,如果在连续的一段时间内,小R的每项能力都提升了相同的次数,小R就会称这段时间为一个均衡时期,比如在连续5天内,小R的每种能力都提升了4次,那么这就是一个长度为5的均衡时期。
于是,问题来了,给出小R n天的能力提升数字,请求出均衡时期的最大长度.
【输入文件】
第一行有两个整数n,m,表示有n天,m种能力。
接下来有n行,每行有一个整数,分别表示第1到n 天的能力提升数字。
能力提升数字转化为二进制后,从右到左的每一位表示对应的能力是否在当天得到了一次提升。
n<=100000, m<=30
【输出文件】
输出只有一个整数,表示长度最大的均衡时期的长度。
【样例输入】
7 3
7
6
7
2
1
4
2
【样例输出】
4
【样例解释】
每天被提升的能力种类分别为:
第一天:1,2,3
第二天:2,3
第三天:1,2,3
第四天:2
第五天:1
第六天:3
第七天:2
第三天到第六天为长度最长的均衡时期
因为这四天每种能力分别提升了 2次
【数据规模】对于50%的数据,N <= 1000。
花园
M=2(K=1)且不是环状: Fibonacci数
M=2(K=1) 环状: Lucas数(类似Fibonacci)F*(n) = F*(n-1) + F*(n—2) F*(2)=3 F*(3)=4
状态压缩动态规划+矩阵乘法
枚举:头M个花圃的状态(二进制)
每M个花圃的状态进行压缩
参考程序:
const
maxn=1000000007;
type arr=array[0。
.64,0。
64]of int64;
var
can,ans,d:arr;
tot,m,k,i,j,L,kk,ans_:longint;
n,t:int64;
flag:boolean;
a,p:array[0。
.1000]of boolean;
f,b:array[0.。
1000]of longint;
function cheng(a,b:arr):arr;
var c:arr; i,j,k:longint;
begin
fillchar(c,sizeof(c),0);
for i:=0 to 1 shl m—1 do
for j:=0 to 1 shl m-1 do
for k:=0 to 1 shl m-1 do
c[j,k]:=(c[j,k]+a[j,i]*b[i,k])mod maxn;
exit(c);
end;
procedure ok(L,i:longint);
var j,k,t,tot:longint;
begin
if p[i] then
begin
flag:=true;
t:=i shl m+L;
tot:=0;
for j:=1 to 2*m do
begin
b[j]:=t and 1;
t:=t shr 1;
end;
for j:=1 to m do
begin
tot:=0;
for k:=j to j+m-1 do
if b[k]=1 then
inc(tot);
if tot>kk then
begin。