20190712B组

20190712B组

T1:10(0)

赛时:

第一题看似要找规律,但又不是。

于是我想应该是数论——排列组合?

可是推不出来,放弃去打暴力,就这样与正解擦边而过。

回想起来真有点痛心。

赛后:

假设将买《变形金刚3》票的人记为s 。

买《哈利波特7》的人记为x,则n个买《变形金刚3》的与m个买《哈利波特7》的人的队伍就可以用一个具有n个s和m个x的字符串,显然这样的字符串共有C(n+m,n)个,其中不满足问题要求的串一定存在一个最靠左的位置p,使得从第一个字符到第p个字符为止的子串中x的个数比s的个数大1.

如sxsxx就是一个不满足条件的串,其中p=5。

我们将从头到p为止的子串中的字符s换成x则得到一个具有n+1个s,m-1个x的串,可以证明这种转换是一一对应的,即任意一个n+1个s,m-1个x的串都可以按照逆规则转换成一个不满足题目条件的串,转换规则为在任意一个n+1个s,m-1个x中找到最靠左的p,使得从头到p的子串中s的个数比x个数大1,将到p为止的子串中的s与x互换则得到n个s和m个x的串,且此串一定不能满足条件,而具有n+1个s,m-1个x的串只有C(n+m,n+1)。

那么ans=C(n+m,n)-C(n+m,n+1)=(n+1-m)*(m+n)!/(m!*(n+1)!)中种方案可满足条件。

由于问题的规模很大,结果远远超出longint,要用高精度算法,虽然结果表达式中有分母,但实际结果一定是整数,所以不需要除法运算,具体运算时只要求出(n+1-m)*(m+n)!/(m!*(n+1)!的质因子分解式,然后做高精度即可,而任意一个质因子r在n!中出现次数为[n/r]+[n/(r^2)]+[n/(r^3)]+...[n/(r^k)],[]为取整。

算法:

数论——排列组合

T2:100(100)

赛时:

一眼望去就知道是道水题。

直接去找01串的数。

不管用bfs或dfs或for,都可以。

但看到数据,要用unsigned long long,便立马打起十二分精神。

赛后:

如果从m出发来求的话就不好做了,我们可以从n*m出发来做,实际上我们只关心对n的余数,而一个数(x1x2...xn)对n的余数可以通过(x1x2x3...xn-1)对n的余数得到,关系式为(x1x2...xn)mod n =(10*(x1x2..xn-1)mod n+xn)mod n ;题目又要求最小的,所以可以用bfs来做,用bfs[i,1]表示当前选0还是1,bfs[i, 2]表示当前的余数,bfs[i,3]表是父结点,用bfs即可。

复杂度O(N)

算法:

暴力

T3:0(100)

赛时:

看完题目,感觉有点像八皇后。

又看了下数据范围,便觉得用状压dp。

可是状压dp的初值想了很就才过了样例。

但结果竟是0分。

发现有细节打错了,改后还是会超时,要做个优化。

赛后:

看到数据范围n<=20,m<=10,方案种数<=2^63-1。

由于方案总数较大,若采用单纯的搜索算法,很难做到不超时。

其实观察一下数据规模中的n和m,m<=10,这是一条重要的信息,m比n*n少得多,那么雕塑“安置在禁区内的方案数”

就必然比“安置在禁区外的”方案数少得多,"安置在禁区内的雕塑仍可以用dfs,但是必须搞清一个问题,计算出:

安置在禁区内的方案总数与求不在禁区的方案数又有什么关系呢,这就恰好就是容斥原理中淘汰原则的十分巧妙的运用。

再来进行进一步的分析:用rk表示把k个雕塑放在了n*n的方格上,并且这k个雕塑都处在禁区放置位置上的方案数,

根据容斥原理的推论n个雕塑都安置在非禁区内的方案数等于

n!-r1*(n-1)!+r2*(n-2)-r3*(n-3)!...(-1)^k*rk*(n-k)!...+(-1)^n*rn

算法:

状压dp

20190712B组_第1张图片

你可能感兴趣的:(总结)