#lg4684. [IOI 2008] Fish

[IOI 2008] Fish

P4684 [IOI 2008] Fish

题目描述

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

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

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

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

输入格式

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

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

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

输出格式

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

输入输出样例 #1

输入 #1

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

输出 #1

4

说明/提示

限制

有总计 7070 分的测试数据,满足 KK 不超过 7,0007,000。在这些测试数据中,有总计 2525 分的测试数据的 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 型宝石(它在初始时刻吞下的)和一块 22 型宝石(从第一条鱼腹中得到的)。

[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]:第三条鱼吃掉第五条鱼,你捉到了第三条鱼。