#P4684. [IOI2008] Fish

[IOI2008] Fish

题目描述

据Scheherazade说,在很远的沙漠中有一个湖。湖中起初有FF条鱼。选择最值钱的KK种宝石,对FF条鱼的每一条只喂给它一块宝石。注意,因为KK可能小于FF,两条或更多的鱼可能会吞下同一种宝石。

随着时间的流逝,有些鱼吃掉了别的鱼。一条鱼能够吃掉另一条鱼,当且仅当它的长度至少是被吃掉的鱼的两倍(AA 能吃掉BB 当且仅当LA2LBL_A \geq 2L_B)。没有规则说明一条鱼何时会吃掉另一条鱼。有的鱼可能会一条接一条地吃掉几条小鱼,而有的鱼可能不吃别的鱼,即使它们有能力吃。当一条鱼吃掉一条小鱼时,它的身长并不改变,但是小鱼腹中的宝石会完好无损地进到大鱼腹中。

据Scheherazade说,如果你能够找到那个湖,你会被准许捕捉一条鱼,并且得到鱼腹中的宝石。你很想试试运气,但是在出发前很想知道捉到一条鱼可能会有多少种不同的宝石组合。

写一个程序,给定每条鱼的长度以及其最初吞食的宝石的种类,找出鱼腹中宝石不同组合的数量对给定整数MM取模的值。组合由每种宝石的数量定义,与宝石的排列顺序无关。同一类宝石中任意两块是没有区别的。

输入格式

你的程序需要从标准输入上读入下列数据:

  • 第一行是整数FF, 即湖中最初鱼的数量。
  • 第二行是整数KK, 即宝石的种类数。不同类型的宝石分别用从 11KK的整数表示。
  • 第三行是整数MM
  • 以后 FF 行中的每一行用由一个空格分隔的两个整数描述一条鱼:按顺序分别是鱼的长度以及鱼腹中的宝石的类型。

注意: 在所有的测试用例中,KK 种宝石中的每一种都会至少有一块。

输出格式

你的程序需要在标准输出上输出一个介于00M1M-1(包含)的整数,即宝石所有可能的不同组合数量模MM,占一行。注意,在问题求解中,数值MM除了简化计算外没有其他的作用。

5
3
7
2 2
5 1
8 3
4 1
2 3
4

提示

限制

有总计70分的测试数据,其中KK不超过7,0007,000。在这些测试数据中,有总计25分的测试数据的KK不超过2020

对于所有的测试数据,1F500,0001 \leq F \leq 500,0001KF1 \leq K \leq F2M30,0002 \leq M \leq 30,0001LX1,000,000,0001 \leq L_X \leq 1,000,000,000

样例说明

1111 种可能的组合,所以你需要输出44,也就是111177。这些可能的组合是: $[1] [1,2] [1,2,3] [1,2,3,3] [1,3] [1,3,3] [2] [2,3] [2,3,3] [3]$ 和 [3,3][3,3]。(对每一种组合, 我们列出其所包含的宝石。 例如,[2,3,3][2,3,3] 包含一块22型宝石和两块33型宝石)

这些组合可以由下述方式获得:

[1][1]: 如果你在第二条鱼 (或第四条) 吃掉任何其它鱼之前捕捉到它。

[1,2][1,2]: 如果第二条鱼吃掉第一条鱼, 它就会有一块 11 型宝石(它在初始时刻吞下的) 和一块2型宝石 (从第一条鱼腹中得到的)。

[1,2,3][1,2,3]: 一种可能的途径是: 第四条鱼吃掉第一条鱼,然后第三条鱼又吃掉它。如果你此时捉到了第三条鱼,那它腹中就有这三种宝石一样一块

[1,2,3,3][1,2,3,3]: 第四条鱼吃掉第一条鱼,第三条鱼吃掉第四条鱼,第三条鱼吃掉第五条鱼,你捉到了第三条鱼。

[1,3][1,3]: 第三条鱼吃掉第四条鱼,你捉到了第三条鱼。

[1,3,3][1,3,3]: 第三条鱼吃掉第五条鱼,第三条鱼吃掉第四条鱼,你捉到了第三条鱼。

[2][2]: 你捉到了第一条鱼。

[2,3][2,3]: 第三条鱼吃掉第一条鱼,你捉到了第三条鱼

[2,3,3][2,3,3]: 第三条鱼吃掉第一条鱼,第三条鱼吃掉第五条鱼,你捉到了第三条鱼。

[3][3]: 你捉到了第三条鱼。

[3,3][3,3]: 第三条鱼吃掉第五条鱼,你捉到了第三条鱼。