开学了,编程时间少了,写题解的时间就更少了,就不能写得太详细了~
先写一下总结吧:
这次考得分数有点难看,但人品的成分还是比较大滴
第一、第三题,大家的分数都差不多,关键拉分的是第二题
第二题的水法,其实我比赛时已经想到了,但是........
觉得拿分可能性不高,就用了暴力
然后居然爆0了.......
而冯某等人用了水法,居然AC了....orz○| ̄|_
好吧,讲了一大堆废话,开始写题解了
第一题:
https://61.142.113.109/senior/#main/show/3057
3057. 【NOIP2012模拟10.26】电影票 (StandardIO)
【问题描述】
笨笨当了很久的道路调度员,笨笨也开始想体验生活,从生活中发现数学问题,锻炼自己思维。最近《变形金刚3》,《哈利波特7》同步放映,明显是决战雌雄,已知王府井中一共有n人买了《变形金刚3》的票,m人买了《哈利波特7》的票,并且n>=m,并且电影院中现在只有两种票,每次只有一个人买,(共有n+m次),这n+m次组成一个排列,为了保证每一个人买票时,《变形金刚3》票房都不少于《哈利波特7》,(n个买《变形金刚3》的人之间没区别,m个买《哈利波特7》的人也没区别),笨笨想着到这样的购票方案有多少种。笨笨想了好久都没想出来,所以笨笨找到了你。
【输入格式】
一行两个数n,m( 0<=m<=n<=5000)
Input
【输入格式】
一行两个数n,m( 0<=m<=n<=5000)
Output
【输出格式】
输出方案种数
Sample Input
1 1
Sample Output
1
Data Constraint
Hint
0<=m<=n<=5000
这道题,其实和义务植树【加强**】http://61.142.113.107:8080/oj/problem.php?id=1224这题很像,
如果单单暴力递推+高精度的话只有10分........
所以我们可以推出一个公式算答案具体怎么推的,我也不知道....
答案值
=C(n+m,n)-C(n+m,n+1)
=(n+1-m)*(m+n)!/(m!*(n+1)!)
=(n+1-m)*(m+1)*(m+2)*(m+3)*.......*(m+n)/(n+1)!
但是.....如果这样暴力高精度算的话不但很麻烦,而且还有可能超时
所以,我们可以对(n+1-m)*(m+1)*(m+2)*(m+3)*.......*(m+n)进行分解质因数,
再对(n+1)!进行分解质因数,
之后把两组分解出来的质因数相抵消,
抵消完后(n+1)!那组的质因数一定不再存在
(因为最后的答案肯定是整数,也就是说(n+1-m)*(m+1)*(m+2)*(m+3)*.......*(m+n)能整除(n+1)!,所以(n+1-m)*(m+1)*(m+2)*(m+3)*.......*(m+n)的质因数一定包含(n+1)!),
那么我们就可以把(n+1-m)*(m+1)*(m+2)*(m+3)*.......*(m+n)这组抵消后的质因数高精度相乘,最后就得到答案
第二题:
https://61.142.113.109/senior/#main/show/3058
3058. 【NOIP2012模拟10.26】火炬手 (StandardIO)
【问题描述】
全运会就要开始了,笨笨想成为湖南地区的火炬手,经过层层选拔,最终到了最后一关,这一关给出了一个正整数n(N<=100000),求一个最小的正整数m,使得n*m的十进制表示形式中只含1和0.
Input
【输入格式】
一行一个数n
Output
【输出格式】
输出一行,如果有解,输出最小的m,否则输出‘no solution’.
Sample Input
12
Sample Output
925
这题用水法就可以过了,
就是用队列生成n*m可能的值,
初值data[i]=1,
之后每次操作就是*10与*10+1两种选择来生成,
之后判断当前的生成值是否能够整除n,
如果能,就输出当前值整除n,否则就一直这样做,
直到找到答案
这题根本不用考虑‘no solution’的情况,因为数据很水..............
第三题:
https://61.142.113.109/senior/#main/show/3059
3059. 【NOIP2012模拟10.26】雕塑 (StandardIO)
【问题描述】
Wcyz为了迎接百年校庆,美化校园,请了校友笨笨将n座雕塑,准备安置在校园内,整个校园可以抽象成一个n*n的大网格,每个1*1网格最多只能安置一座雕塑,但是某些1*1的网格上恰好是一个食堂或湖泊,这些网格是不能安置雕塑的,每个雕塑的造型相同,这样同一种安置方案中交换排列都算一种。任意雕塑在同一行或同一列是不合法的方案。
学校想知道有多少种安置方案,笨笨想从中选择最好的一种方案,笨笨想请你告诉他方
案种数。
Input
【输入格式】
第一行,两个整数n,m(n<=20,m<=10),用空格隔开,n表示n*n的大网格,m表示不能安置雕塑的位置
第二行至m+1行,每行两个数x,y,用空格分开,表示坐标(x,y)的1*1 的网格上不能安置雕塑。
Output
【输出格式】
一个数,方案种数(方案种数<=2^63-1)
Sample Input
6 7
1 1
2 1
2 2
3 3
3 4
4 3
4 4
Sample Output
184
Data Constraint
Hint
n<=20,m<=10
所以捏
就是可以运用题解上一种神奇的方法
神奇到比赛时是几乎不可能想出来的
用rk表示把k个雕塑放在了m个禁区中,
且满足任意两个雕塑不在同一行同一列的方案数
k的范围只要1~m就行
这里直接dfs暴力就好了,就是把所有禁区内的点挑出来,让它们和k个雕塑进行配对...
那么根据容斥原理淘汰原则别问我这是什么鬼,已经严重超纲了
n个雕塑都安置在非禁区内的方案数等于
n!-r1*(n-1)!+r2*(n-2)!-r3*(n-3)!+r4*(n-4)!.......rm*(n-m)!
这玩意照着打就好了,反正我是理解不了的
别管root题解的公式,看我这个就好了,root题解那里的公式有很多很多问题.......
之后你可以把1!~n!的值所有值预处理一下,就方便很多了