#1703. 「THUPC 2019」摆家具 / furniture
「THUPC 2019」摆家具 / furniture
题目描述
你有 件不同的家具,需要摆放在 个不同的房间中。假设每个房间足够大,并且只考虑每件家具处于哪个房间(而不考虑房间内部如何摆放),那么总共有 种不同的摆放方式(注意,不是 )。
摆放家具也算一门学问了,至少不太好乱摆的吧?对于每种摆放方式,我们可以给这种方式打分。例如,某个方案把餐桌放到了卫生间,或是一个卧室放了两张床而另一个卧室没有床,就会获得比较低的分数。由于这个分数关于每件家具、每个房间不是独立的,我们会输入所有 种摆放方式的分数。
你现在心血来潮,想换一换房间的布局。给出一种初始时的摆放方式,你会重复 次下述操作:每次,你会任选一件家具,然后将这件家具移动到任意一个其他房间中。每一轮有 种决策(选择家具的方案数乘以选择另一个房间的方案数),所以总共有 种决策。你需要计算这每一种决策后的摆放方式的得分之和。
不仅如此,我们会给出 次询问,每次输入初始时的摆放方式与 ,你需要在线地回答 种决策后的得分之和(取模)。详见输入与输出格式。
我们如下定义一种摆放方式的编号:
我们将家具用 0 到 的不同整数编号,房间用 到 的不同整数编号。设在某种摆放方式下,第 号家具被放在了 号房间中,则定义这种摆放方式的编号为 。可以发现,所有的 种摆放方式的编号恰好是 到 的不同整数。
另外,设 。
输入格式
第一行输入三个正整数 。
接下来 行,每行输入一个小于 的正整数,依次表示编号为 的摆放方式的得分。
接下来 行,每行输入两个非负整数。设某行的输入为 (保证 ),则此次询问的初始摆放方式的编号为 ,而 ,其中 是你上一个输出的数(对于第一次询问为 )。
同一行内输入的相邻两个数之间以一个空格隔开。
保证 ,;;
输出格式
对于每次询问输出一行,包含一个非负整数,表示该询问的得分之和对 取模的结果。
样例
2 3 3
1
10
100
1000
998244245
100000
1000000
10000000
0 1
0 1
1 233
2
2202003
444957911
第一次询问中,初始摆放方式的编号为 ,。
初始时, 号家具放在 号房间, 号家具放在 号房间, 号家具放在 号房间。经过 次操作后,可能的情况有:
- 将 号家具移动到 号房间,此后的摆放方式编号为 ,得分为 ;
- 将 号家具移动到 号房间,此后的摆放方式编号为 ,得分为 ;
- 将 号家具移动到 号房间,此后的摆放方式编号为 ,得分为 。
所以,所有情况的总得分为 ,对 取模后为 。
第二次询问中,初始摆放方式的编号为 ,。
初始时, 号家具放在 号房间, 号家具放在 号房间, 号家具放在 号房间。经过 次操作后,可能的情况有:
- 将 号家具移动到 号房间,然后将 号家具移动到 号房间,此后的摆放方式编号为 ,得分为 ;
- 将 号家具移动到 号房间,然后将 号家具移动到 号房间,此后的摆放方式编号为 ,得分为 ;
- 将 号家具移动到 号房间,然后将 号家具移动到 号房间,此后的摆放方式编号为 ,得分为 ;
- 将 号家具移动到 号房间,然后将 号家具移动到 号房间,此后的摆放方式编号为 ,得分为 ;
- 将 号家具移动到 号房间,然后将 号家具移动到 号房间,此后的摆放方式编号为 ,得分为 ;
- 将 号家具移动到 号房间,然后将 号家具移动到 号房间,此后的摆放方式编号为 ,得分为 ;
- 将 号家具移动到 号房间,然后将 号家具移动到 号房间,此后的摆放方式编号为 ,得分为 ;
- 将 号家具移动到 号房间,然后将 号家具移动到 号房间,此后的摆放方式编号为 ,得分为 ;
- 将 号家具移动到 号房间,然后将 号家具移动到 号房间,此后的摆放方式编号为 ,得分为 。
所以,所有情况的总得分为 ,对 取模后为 。
第三次询问中,初始摆放方式的编号为 ,。初始时, 号家具放在 号房间, 号家具放在 号房间, 号家具放在 号房间。
……(省略至少 行)
数据范围与提示
来自 THUPC(THU Programming Contest,清华大学程序设计竞赛)2019。
题解等资源可在 https://github.com/wangyurzee7/THUPC2019 查看。